inheritance构造函数

为什么这个代码:

class A { public: explicit A(int x) {} }; class B: public A { }; int main(void) { B *b = new B(5); delete b; } 

导致这些错误:

 main.cpp:在函数'int main()'中:
 main.cpp:13:错误:没有匹配函数调用'B :: B(int)'
 main.cpp:8:注意:候选人是:B :: B()
 main.cpp:8:note:B :: B(const B&)

不应该BinheritanceA的构造函数?

(这是使用gcc)

在C ++ 03中,标准的构造函数不能被inheritance,你需要通过自己调用基类实现来逐个地inheritance它们。 如果你的编译器支持C ++ 11标准,那么就有一个构造函数inheritance。 有关更多信息,请参阅Wikipedia C ++ 11文章 。 用你写的新标准:

 class A { public: explicit A(int x) {} }; class B: public A { using A::A; }; 

构造函数不被inheritance。 它们被子构造函数隐含地或显式地调用。

编译器创build一个默认的构造函数(一个没有参数)和一个默认的复制构造函数(一个参数是对同一types的引用)。 但是如果你想要一个接受int的构造函数,你必须明确地定义它。

 class A { public: explicit A(int x) {} }; class B: public A { public: explicit B(int x) : A(x) { } }; 

更新 :在C ++ 11中,构造函数可以被inheritance。 有关详细信息,请参阅Suma的答案。

你必须明确定义B中的构造函数,并显式调用父类的构造函数。

 B(int x) : A(x) { } 

要么

 B() : A(5) { } 

这是从Bjarne Stroustrup的页面直接获得的 :

如果你这样select的话,你仍然可以通过在派生类中inheritance构造函数来开始自己的脚步,在这个派生类中定义需要初始化的新成员variables:

 struct B1 { B1(int) { } }; struct D1 : B1 { using B1::B1; // implicitly declares D1(int) int x; }; void test() { D1 d(6); // Oops: dx is not initialized D1 e; // error: D1 has no default constructor } 

正确的代码是

 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没有参数构造函数,其次它应该有基类初始化程序来调用基类参数构造函数的构造函数

如何使用模板函数绑定所有构造函数?

 template <class... T> Derived(T... t) : Base(t...) {}