【问题标题】:Force a Derived Class to use the Constructor of the Base Class强制派生类使用基类的构造函数
【发布时间】:2012-09-28 19:36:27
【问题描述】:

有没有办法强制派生类使用抽象基类的构造函数?它一定不是真正的构造函数,我对创造性的解决方案持开放态度。

class Abstract
{
private:
    int Member;
    string Text;

public:
    Abstract(int Member, string Text)
    {
        this->Member = Member; 
        this->Text = Text;
    }

    // e.g. defining virtual functions
}

例如,我的抽象类有一些私有成员,每个派生类也应该有。并且它们应该在构造函数中定义,即使违背派生类的意愿。

我知道构造函数不是继承的。但是有没有产生类似行为的解决方法?

【问题讨论】:

  • 未定义默认构造函数会强制派生类使用任何其他构造函数。
  • 不清楚问题是什么。从Abstract 派生的任何类都必须使用Abstract 中唯一的构造函数。
  • 只是不要创建任何不符合您要求的构造函数。由于派生类实例是基类的实例,因此必须调用构造函数。您无需做任何特别的事情。

标签: c++ oop class inheritance constructor


【解决方案1】:

使用派生类的构造函数的初始化列表。

class Base
{
    Base(int Member, string Text) { //...
    }
};

class Derived : public Base
{
    Derived(int Member, string Text) : Base(Member, Text) {
                                    // ^^^^^^^^^^^^^^^^^^
        // ...
    }
};

【讨论】:

  • 这是一个有效的评论,但我认为它不能回答 OP 的问题。
  • 我已经想到了这种方法,但这不是我想要的。因为派生类不必必须使用初始化列表。此外,它会与五个或更多参数混淆。
  • @KonradRudolph 问题是“有没有办法强制派生类使用抽象基类的构造函数?”这确实足以强制使用 Base -类构造函数。
  • @Robᵩ 是的,但是 OP 的代码已经如此。关键是这个答案中没有任何内容可以解释这一点。请参阅您上面的 OP 评论。
  • @sharethis - 是的,派生类确实必须使用初始化列表。如果没有,则没有调用有效的Base 构造函数,这是非法的。
【解决方案2】:

根据其他用户的建议,您必须将基类构造函数调用到派生类构造函数的初始化列表中。

但 C++11 还提出了另一个很酷的解决方案:inherited constructors:

class Base
{
    Base(int Member, string Text) { };
};

class Derived : public Base
{
    using Base::Base; // <-- Brings to derived the Base's constructor.
};

但您必须确保您的编译器可以使用 C++11 功能;当然,研究继承的构造函数是否符合您的要求,而不是仅仅因为它很酷而使用它

【讨论】:

  • 感谢您的精彩补充!
猜你喜欢
  • 2011-09-27
  • 1970-01-01
  • 2016-07-19
  • 2018-07-16
  • 2018-07-21
  • 2018-09-24
  • 2015-08-18
  • 2015-09-14
  • 2021-11-11
相关资源
最近更新 更多