使用 C 基类构造函数?

新手上路,请多包涵

在使用模板时,我遇到了需要使继承类可访问基类构造函数以创建对象以减少复制/粘贴操作。我正在考虑通过 using 关键字以与函数大小写相同的方式执行此操作,但这不起作用。

 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)'
}

所以我的问题:有没有办法在继承类中的新构造函数被声明后导入基类构造函数?

或者只有一种选择来声明新的构造函数并从初始化列表中调用基本构造函数?

原文由 minyor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 565
2 个回答

首选初始化:

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

在 C++11 中,您可以使用继承构造函数(其语法见于您的示例 D )。

更新: 自 4.8 版以来,GCC 中提供了继承构造函数。


如果您没有发现初始化吸引人(例如,由于您的实际情况中的可能性数量),那么您可能会喜欢这种方法用于某些 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;
}

原文由 justin 发布,翻译遵循 CC BY-SA 3.0 许可协议

class A
{
public:
    A(int val) {}
    A(string name) {}
};

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

除了其他答案,如果基类有多个构造函数,而您只想继承其中的一些,则可以删除不需要的。

  class B : public A
 {
    using A::A;
    B(string) = delete;
 };

原文由 Zhang 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题