在提供的代码片段中,我们在尝试使用 B *b = new 初始化 B 类的对象时观察到错误B(5);,尽管基类 A 中存在构造函数。这提出了为什么继承的构造函数在此不可访问的问题case.
理解这个问题的关键在于 C 中复杂的构造函数继承规则。在没有显式构造函数继承的情况下,派生类不会自动从其基类继承构造函数。 C 03 标准就是这种情况。要实现构造函数继承,派生类必须显式使用 using 关键字,如以下更正后的代码所示:
class A { public: explicit A(int x) {} }; class B: public A { using A::A; };
通过添加 using A::A;,B 类现在继承了构造函数A 类,解决错误。需要注意的是,这种继承适用于基类中的所有构造函数,而派生类不能选择性地仅继承某些构造函数。
如果您的编译器支持 C 11 标准,则可以使用构造函数的 using 关键字遗产。然而,在 C 03 标准中,构造函数默认情况下是不被继承的,必须通过调用基构造函数在派生类中手动实现。
对于模板化基类,还可以使用 using 关键字继承构造函数,如本示例所示:
template<class T> class my_vector : public vector<T> { public: using vector<T>::vector; ///Takes all vector's constructors /* */ };
以上是为什么派生类不继承 C 中的构造函数以及如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!