Wil*_*oat 4 c++ polymorphism inheritance constructor initializer-list
我想要一个派生类,它有一个初始化继承成员的默认构造函数。
为什么我可以这样做
class base{
protected:
int data;
};
class derived: public base{
public:
derived(){ //note
data = 42;
}
};
int main(){
derived d();
}
Run Code Online (Sandbox Code Playgroud)
但不是这个
class base{
protected:
int data;
};
class derived: public base{
public:
derived(): //note
data(42){}
};
int main(){
derived d();
}
Run Code Online (Sandbox Code Playgroud)
error: class ‘derived’ does not have any field named ‘data’
一个对象只能被初始化一次。(例外情况是,如果您初始化它然后销毁它;然后您可以稍后再次初始化它。)
如果你可以做你想做的事情,那么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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6093 次 |
| 最近记录: |