为什么这段代码:
class A { public: explicit A(int x) {} }; class B: public A { }; int main(void) { B *b = new B(5); delete b; }
导致这些错误:
main.cpp: In function ‘int main()’: main.cpp:13: error: no matching function for call to ‘B::B(int)’ main.cpp:8: note: candidates are: B::B() main.cpp:8: note: B::B(const B&)
B不应该继承A的构造函数吗?
(这是使用gcc)
如果您的编译器支持C++ 11标准,则使用构造函数继承using
(双关语).有关更多信息,请参阅Wikipedia C++ 11文章.你写:
class A { public: explicit A(int x) {} }; class B: public A { using A::A; };
这是全有或全无 - 你不能只继承一些构造函数,如果你写这个,你继承了所有这些.要仅继承选定的构造函数,您需要手动编写各个构造函数,并根据需要从中调用基础构造函数.
历史上,构造函数不能在C++ 03标准中继承.您需要通过自己调用基本实现来逐个手动继承它们.
构造函数不是继承的.它们由子构造函数隐式或显式调用.
编译器创建一个默认构造函数(一个没有参数)和一个默认复制构造函数(一个参数是同一类型的引用).但是如果你想要一个接受int的构造函数,你必须明确地定义它.
class A { public: explicit A(int x) {} }; class B: public A { public: explicit B(int x) : A(x) { } };
更新:在C++ 11中,构造函数可以继承.有关详细信息,请参阅Suma的答案.
您必须在B中显式定义构造函数并显式调用父级的构造函数.
B(int x) : A(x) { }
要么
B() : A(5) { }