【问题标题】:Constructor inheritance problems c构造函数继承问题c
【发布时间】:2013-12-01 14:16:58
【问题描述】:

如果我的基类的构造函数带参数,我如何创建一个继承自它的类,并使用派生类的构造函数执行基类的构造函数?

例如,假设我的基类的讲师接受一个整数,并用它做了一个很酷的技巧,我将如何制作它以便从它继承的所有类都可以做同样的事情

伪代码

baseClass instance(99); //does an awesome trick, nice
derivedClass instance(99); //<-- should do the same as above

正如我现在所拥有的,我已经定义了我的基类的构造函数,但是对于派生类,我将它的构造函数留空,因为我希望它完全按照基类构造函数所做的,仅此而已。但是,这给了我一个错误:没有对'baseClass()'的匹配函数调用,候选者是:baseClass(int),候选者需要1个参数,提供0个

我必须将基类的构造函数设为虚拟还是什么?

【问题讨论】:

  • 编辑:这是错误的信息。更新:你使用derivedClass() : baseClass(7){}
  • 另外,除非base 包含纯虚函数,否则您应该删除abstract-class 标签。
  • 如果基类的构造函数改变了使用它的基类的实例怎么办?它还会改变派生类的实例吗? @戴夫
  • @user1538301,怎么改?在构造函数运行之前没有有效的实例。

标签: c++ inheritance constructor polymorphism abstract-class


【解决方案1】:

这在当前的 C++ 标准中很容易,但仍需要您采取一些措施:

struct baseClass
{
  explicit baseClass(int);
};

struct derivedClass : baseClass
{
  using baseClass::baseClass;  // inherit *all* of baseClass' constructors
};

在之前的标准 C++03 中,您必须在派生类型中实现构造函数并在初始化列表中调用基类的构造函数:

struct derivedClass : baseClass
{
  explicit derivedClass(int i) : baseClass(i) {}
};

注意:我在这里使用struct 来节省输入:默认成员访问和继承是public

【讨论】:

  • 否决票的任何理由?如果有任何问题,我很乐意解决这个问题。
【解决方案2】:

这个想法是derivedClass 无论如何都需要调用baseClass 构造函数,因为它需要完成它的构造。您得到的错误是由于编译器在没有显式调用基本构造函数的情况下试图调用默认构造函数。

但是,在您的情况下,它不存在,因为您已经定义了一个采用int 的构造函数。为了做你想做的事,一个解决方案可能是这样做:

class derivedClass : baseClass {
    public:
        derivedClass(int x) : baseClass(x) {}
};

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 2019-01-21
    • 2020-02-10
    相关资源
    最近更新 更多