Inheriting constructors
为什么此代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class A { public: explicit A(int x) {} }; class B: public A { }; int main(void) { B *b = new B(5); delete b; } |
导致这些错误:
1 2 3 4 | 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标准,则使用EDCOX1 OR 0(PUN打算)有一个构造函数继承。更多见维基百科C++ 11文章。你写:
1 2 3 4 5 6 7 8 9 10 | class A { public: explicit A(int x) {} }; class B: public A { using A::A; }; |
这是全部还是全部—您不能只继承一些构造函数,如果编写此命令,您将继承所有的构造函数。要只继承选定的构造函数,您需要手动编写各个构造函数,并根据需要从中调用基本构造函数。
历史上的构造函数不能在C++ 03标准中继承。您需要通过自己调用基实现来逐个手动继承它们。
不继承构造函数。它们由子构造函数隐式或显式调用。
编译器创建一个默认的构造函数(一个没有参数的)和一个默认的复制构造函数(一个有参数的复制构造函数是对同一类型的引用)。但是如果您想要一个接受int的构造函数,您必须显式地定义它。
1 2 3 4 5 6 7 8 9 10 11 | class A { public: explicit A(int x) {} }; class B: public A { public: explicit B(int x) : A(x) { } }; |
更新:在C++ 11中,构造函数可以继承。有关详细信息,请参阅Suma的答案。
必须在B中显式定义构造函数,并显式调用父级的构造函数。
1 | B(int x) : A(x) { } |
或
1 | B() : A(5) { } |
这是直接从bjarne stroustrup的页面:
如果您这样选择,您仍然可以通过继承派生类中的构造函数(在派生类中定义了需要初始化的新成员变量)来自鸣得意:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | struct B1 { B1(int) { } }; struct D1 : B1 { using B1::B1; // implicitly declares D1(int) int x; }; void test() { D1 d(6); // Oops: d.x is not initialized D1 e; // error: D1 has no default constructor } |
使用模板函数绑定所有构造函数怎么样?
1 | template <class... T> Derived(T... t) : Base(t...) {} |
正确的代码是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class A { public: explicit A(int x) {} }; class B: public A { public: B(int a):A(a){ } }; main() { B *b = new B(5); delete b; } |
错误是B/C类B没有参数构造函数,第二个错误是它应该有基类初始值设定项来调用基类参数构造函数的构造函数