tic*_*ter 4 c++ abstract-class const pure-virtual
我有一个纯粹的虚拟类定义如下:
class BaseClass {
protected:
const int var;
public:
void somefun() = 0; // what I mean by a purely virtual class
// stuff...
};
Run Code Online (Sandbox Code Playgroud)
如果我不添加如此定义的构造函数:
BaseClass(const int & VAR) : var(VAR) {};
Run Code Online (Sandbox Code Playgroud)
我必须在随后的派生类中使用,我的派生类不能将const变量var初始化为它想要的任何值.现在我真的明白这里发生了什么.在构造派生类之前,会调用基类的构造函数,此时必须初始化const成员变量.我的问题不是"如何使我的代码工作"这样的问题,这已经完成了.我的问题是为什么编译器认为这是必要的.对于纯粹的虚拟课程,我不应该被允许写下这样的内容:
class DerivedClass : BaseClass {
public:
DerivedClass() : var(SOME_VALUE) {};
}
Run Code Online (Sandbox Code Playgroud)
如果编译器知道对BaseClass构造函数的调用必然会跟随对某个派生类构造函数的调用(因为抽象类型的对象永远不能被实例化),它不应该给我们更多的回旋余地吗?
这是否是C++选择解决Diamond问题的结果?即使是这种情况,编译器是否应该至少以某种方式允许在派生类中定义纯虚函数的const成员变量的可能性?这太复杂了还是钻石问题的C++解决方案搞得一团糟?
感谢大家的帮助.
它不是"纯粹的虚拟"(无论你的意思是什么) - 它包含一个数据成员.
类成员只能由该类的构造函数的初始化列表初始化,而不能由派生类初始化.这就是指定对象初始化的方式:初始化的所有成员在构造函数体开始之前初始化.
必须初始化常量对象,因为以后无法为它们分配值.
因此,具有常量数据成员的类必须在每个构造函数中初始化它.
| 归档时间: |
|
| 查看次数: |
13226 次 |
| 最近记录: |