使用C ++基类构造函数?

在处理模板的时候,我遇到了一个需要,即为了创build对象而从inheritance类访问基类构造函数,以减less复制/粘贴操作。 我想通过using关键字以相同的方式与function的情况下做到这一点,但这是行不通的。

 class A { public: A(int val) {} }; class B : public A { }; class C : public A { public: C(const string &val) {} }; class D : public A { public: D(const string &val) {} using A::A; // g++ error: A::A names constructor }; void main() { B b(10); // Ok. (A::A constructor is not overlapped) C c(10); // error: no matching function to call to 'C::C(int)' } 

所以我的问题:有没有办法导入基类的构造函数新的inheritance类声明之后?

或者只有一个select来声明新的构造函数,并从初始化列表调用基础的构造函数?

优先初始化:

 class C : public A { public: C(const string &val) : A(anInt) {} }; 

在C ++ 11中,您可以使用inheritance构造函数(具有在您的示例D看到的语法)。

更新:从4.8版本开始,inheritance构造函数已经可以在GCC中使用了。


如果你没有find初始化的吸引力(例如,由于在你的实际情况下的可能性),那么你可能会赞成这种方法的一些TMP结构:

 class A { public: A() {} virtual ~A() {} void init(int) { std::cout << "A\n"; } }; class B : public A { public: B() : A() {} void init(int) { std::cout << "B\n"; } }; class C : public A { public: C() : A() {} void init(int) { std::cout << "C\n"; } }; class D : public A { public: D() : A() {} using A::init; void init(const std::string& s) { std::cout << "D -> " << s << "\n"; } }; int main() { B b; b.init(10); C c; c.init(10); D d; d.init(10); d.init("a"); return 0; } 

是的,既然C ++ 11:

 struct B2 { B2(int = 13, int = 42); }; struct D2 : B2 { using B2::B2; // The set of inherited constructors is // 1. B2(const B2&) // 2. B2(B2&&) // 3. B2(int = 13, int = 42) // 4. B2(int = 13) // 5. B2() // D2 has the following constructors: // 1. D2() // 2. D2(const D2&) // 3. D2(D2&&) // 4. D2(int, int) <- inherited // 5. D2(int) <- inherited }; 

有关更多信息,请参阅http://en.cppreference.com/w/cpp/language/using_declaration

不,那不是这样做的。 初始化基类的正常方法是在初始化列表中:

 class A { public: A(int val) {} }; class B : public A { public: B( int v) : A( v ) { } }; void main() { B b(10); } 

您需要在每个派生类中声明构造函数,然后从初始化程序列表中调用基类构造函数:

 class D : public A { public: D(const string &val) : A(0) {} D( int val ) : A( val ) {} }; D variable1( "Hello" ); D variable2( 10 ); 

C ++ 11允许你使用在你的D代码中使用的A :: A语法,但是C ++ 11的特性现在还不被所有的编译器支持,所以最好使用旧的C ++方法直到这个function是在您的代码将用于所有编译器中实现的。

这里是关于超类构造函数调用规则的一个很好的讨论。 您总是希望在派生类构造函数之前调用基类构造函数,以正确形成对象。 这就是为什么使用这种forms

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