【问题标题】:Initializer List for Derived Class派生类的初始化列表
【发布时间】:2015-10-13 00:00:51
【问题描述】:

我想要一个派生类,它有一个默认构造函数来初始化继承的成员。

为什么我可以这样做

class base{
protected:
 int data;
};

class derived: public base{
public:
 derived(){ //note
  data = 42;
 }
};

int main(){
 derived d();
}

但不是这个

class base{
protected:
 int data;
};

class derived: public base{
public:
 derived(): //note
  data(42){}
};

int main(){
 derived d();
}

error: class ‘derived’ does not have any field named ‘data’

【问题讨论】:

    标签: c++ inheritance constructor polymorphism initializer-list


    【解决方案1】:

    一个对象只能被初始化一次。 (例外是如果你初始化它然后销毁它;那么你可以稍后再次初始化它。)

    如果你能做你想做的事,那么base::data 可能会被初始化两次。 base 的某些构造函数可能会对其进行初始化(尽管在您的特定情况下不会),然后 derived 构造函数将对其进行初始化,可能是第二次。为了防止这种情况,该语言只允许构造函数初始化它自己的类的成员。

    初始化不同于赋值。分配给data 没问题:您只能初始化data 一次,但您可以根据需要多次分配。

    您可能想要为base 编写一个构造函数,它接受data 的值。

    class base{
    protected:
     int data;
     base(int data): data(data) {}
    };
    
    class derived: public base{
    public:
     derived(): base(42) {}
    };
    
    int main(){
     derived d{}; // note: use curly braces to avoid declaring a function
    }
    

    【讨论】:

    • 我会尽快向 OOP 新手(呃)的读者澄清一下——一个对象(大致)是一个类的实例,所以虽然你可以拥有同一个类的多个对象,但每个对象这些对象只能初始化一次。
    • @JasonMc92 int 也是 C++ 中的一个对象。对象是一个存储区域。
    • 是的,我知道。我只是在说明一下。早在我学习 OOP 时,我曾经对“类”和“对象”感到困惑,所以我只是为这些群体提供了一点额外的清晰度。 :D
    【解决方案2】:

    您需要一个基类构造函数来完成这项工作。你可以在这里寻找更多解释 -

    Initialize parent's protected members with initialization list (C++)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-19
      • 2022-01-21
      • 2010-11-10
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      相关资源
      最近更新 更多