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...) {}