派生类的初始化列表
Initializer List for Derived Class
我想要有一个派生类,它有一个默认构造函数来初始化继承的成员。
为什么我可以这样做
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’
对象只能初始化一次。(例外情况是,如果你初始化它,然后销毁它;然后您可以稍后再初始化它。
如果你可以做你想做的,那么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
}
这个工作需要一个基类构造函数。你可以在这里找到更多的解释-
用初始化列表初始化父级's受保护成员(c++)
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C++11 中的混合列表初始化
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++20 从括号中的值列表初始化聚合,不支持内部数组
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 默认参数和空列表初始化
- 如何在列表初始化中放置额外的语句?
- C++列表初始化允许多个用户定义的转换
- 列表初始化是否将原子初始化为零
- 使用可变模板列表初始化数组,并放置new
- 使用整数初始化列表初始化长双精度的向量
- 直接列表初始化的自动规则
- 使用初始化列表初始化unique_ptr的容器,继续
- 如何修复"非聚合无法使用初始值设定项列表初始化" <map>
- 直接列表初始化和复制列表初始化之间的差异
- 为什么我可以在不使用赋值运算符的情况下使用列表初始化普通数组
- C++ - 使用类中的初始值设定项列表初始化动态集