具有非默认构造函数的 C++ 继承

标签 c++ inheritance constructor

对于一个项目,我正在查看存在以下情况的案例。有一个 foo 类,它在构造时需要一个标识号 x。所以它的构造函数参数看起来像 foo(x)。

现在我想派生一个基于 foo 的类,称为 bar,它基本上在内部包含两个 foo,而对于外部世界则充当一个 foo。我想要这样做的方法是为 bar 使用两个构造函数参数 y 和 z,然后在构造函数中生成 foo(y) 和 foo(z)。我希望一切都清楚。

我当前的实现类似于:

class bar : public foo {
public:
    bar(int y, int z)
    {
        _foo_ptr_1 = foo::foo(y);
        _foo_ptr_2 = foo::foo(z);
    };

private:
    foo *_foo_ptr_1;
    foo *_foo_ptr_2;
};

其中 foo 是一个已经存在的类,看起来像这样:

class foo {
public:
    foo(int x) :
    _private_var(x) {
    };
};

现在,我知道因为 foo 没有带零参数的默认构造函数,所以这将不起作用。出于多种原因,我不想向 foo 添加一个参数为零的无意义的构造函数。有什么好的方法可以使它正常工作吗?现在我的编译器(Ubuntu 下的 gcc)给我以下错误:

error::no matching function for call to foo::foo()

尝试解决此问题的快速尝试是替换 bar 的构造函数:

bar(int y, int z) : foo(y)

但这也行不通。

我还没能在网上找到一个可行的解决方案,如果有任何帮助,我将不胜感激。

最佳答案

这里的问题是您正试图解决继承问题。

通过派生 foo 形式,您是说 barfoo。 foo 有一个 _private_var,所以你必须用一个有意义的值填充这个 var。

如果您想以与foo 相同的方式工作,但不共享其实现,您只想与foo 共享一个接口(interface)。这是在 C++ 中通过使用仅具有纯虚函数和默认构造函数的类来完成的。例如称它为 foo_interface。然后,这应该由 foo(具有“真实”实现)和 bar 实现,并通过实现组合两个 foo' 的结果小号

您还应该以不同的方式实例化 foo*:

   _foo_ptr_1 = foo::foo(y);

应该是

   _foo_ptr_1 = new foo(y); 

或者更好的是,如果可以的话,不要让 foo 成为一个指针。如此处所述:https://stackoverflow.com/a/23681932/137369

关于具有非默认构造函数的 C++ 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23681804/

相关文章:

Scala继承参数化构造函数

Scala 编译器和 JVM 对加载的 Akka 版本不一致

c++ - XMLRPCPP 异步处理多个调用?

c++ - 程序在 cout 上崩溃并出现新行 "\n"

javascript - 为什么Parasitic Combination Inheritance中需要复制原型(prototype)?

java - JAVA中当基类的引用变量指向子类的对象时,内部会发生什么

c++ - 使用多态时如何避免向下转换?

c++ - C++ 对象没有得到 std::moved 吗?

c++ - 支持各种操作的数据结构的实现

c++ - 如果我们使用参数构造函数,我们是否需要在 C++ 中提供默认构造函数?