【问题标题】:Will a derived class call a protected constructor in base class before its own constructor?派生类会在其自己的构造函数之前调用基类中的受保护构造函数吗?
【发布时间】:2021-10-03 11:59:09
【问题描述】:

我的派生类应该通过与基类相同的初始化过程,初始化一些变量并设置一些状态。下面是一个简化的例子:

class Base
{
    protected:
        int x = 0;

        Base() { x = 1; }
    
};

class Sub : public Base
{
    public:
        void printX()
        {
            printf("%d", x);
        }
};

我的子类“Sub”的默认构造函数会调用基类中受保护的构造函数吗?这意味着如果打印,子类中的 x 将为 1。

编辑:为 printX() 添加返回类型

【问题讨论】:

  • 投反对票,因为您可以轻松尝试。
  • 在 C++ 中,基类在派生类之前构造。 (其他一些 OO 语言则相反。)
  • @Phil1970 您也可以轻松尝试int x; std::cout << x; 的输出,但除非您已经知道答案,否则您无法轻易知道它有什么问题。反复试验可能会产生误导
  • @463035818_is_not_a_number 观察到 1 被打印就足以确定 90%。然后他可以在构造函数中添加一个额外的printf 来确定。显示缺乏努力的另一个原因是代码无法编译,因为声明中缺少 printX 返回类型。使用调试器也很容易检查。
  • @Phil1970 一般不鼓励反对投票。我们可以继续讨论,我不会同意。没关系。

标签: c++ inheritance constructor subclass protected


【解决方案1】:

是的,默认构造函数是派生类将调用其基类的默认构造函数。 (虚拟继承变得更有趣,但在 sn-p 中没有,所以我们不需要深入探讨这些的恐怖)。

有关详细信息,请参阅https://en.cppreference.com/w/cpp/language/default_constructor 上的隐式定义的默认构造函数

...也就是说,它调用基类的默认构造函数和 此类的非静态成员。

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 2021-10-05
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2018-07-16
    • 2018-07-21
    • 1970-01-01
    • 2012-12-07
    相关资源
    最近更新 更多