2008-12-07 131 views
148

为什么验证码:继承构造

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继承的构造?

(这是使用gcc)

回答

248

在C++ 03标准构造函数不能被继承,你需要通过自己调用基类实现手动逐个地继承它们。如果您的编译器支持C++ 11标准,则会有构造函数继承。欲了解更多信息,请参阅Wikipedia C++11 article。随着新标准的编写:

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

class B: public A 
{ 
    using A::A; 
}; 
+9

这是因为一年多了,一直没有任何编译器能够真正建立在上面的代码:-) – Mikhail 2013-01-21 04:51:43

+11

@Mikhail相当邪恶:两个铛和g ++现在应该支持继承构造函数: HTTP://铛.llvm.org/cxx_status.html http://gcc.gnu.org/projects/cxx0x.html 建议使用upvoting这一个作为正确的答案。 – 2013-05-05 11:46:39

+0

只是问,继承的构造函数是否能够访问/初始化基类的私有成员?或者我是否必须将它们指定为受保护的? – Markasoftware 2014-06-22 05:13:40

4

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

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

B() : A(5) { } 
80

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

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

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

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

UPDATE:在C++ 11,构造函数可以继承。有关详情,请参阅Suma的回答。

1

正确的代码

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 B/C级还没有参数的构造函数和第二它应该有基类初始调用基类的构造函数参数的构造函数

3

这是直接从Bjarne Stroustrup's page

如果你选择,你仍然可以拍摄自己的脚被我在派生类中定义构造函数,在其中定义需要初始化的新成员变量:

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