我有一个纯虚拟类定义如下:
class BaseClass {
protected:
const int var;
public:
void somefun() = 0; // what I mean by a purely virtual class
// stuff...
};
如果我不添加这样定义的构造函数:
BaseClass(const int & VAR) : var(VAR) {};
我随后必须在派生类中使用它,但我的派生类无法将 const 变量 var 初始化为它想要的任何值。现在我真的明白这是怎么回事了。在构造派生类之前,调用基类的构造函数,此时必须初始化 const 成员变量。我的问题不是“如何让我的代码工作”之类的问题,这已经完成了。我的问题是为什么编译器认为这是必要的。对于纯虚拟类,我不应该被允许写这样的东西:
class DerivedClass : BaseClass {
public:
DerivedClass() : var(SOME_VALUE) {};
}
如果编译器知道对 BaseClass 构造函数的调用后面必然会调用某个派生类构造函数(因为抽象类型的对象永远无法实例化),难道不应该给我们更多的余地吗?
这都是 C++ 选择绕过 Diamond 问题的结果吗?即使是这种情况,编译器是否至少应该以某种方式允许在派生类中定义纯虚函数的 const 成员变量的可能性?这是否太复杂了,或者是否与钻石问题的 C++ 解决方案相混淆?
感谢大家的帮助。
它不是“纯虚拟的”(无论你的意思是什么)——它包含一个数据成员。
类成员只能由该类的构造函数的初始化列表进行初始化,而不能由派生类的构造函数的初始化列表进行初始化。这就是对象初始化的指定方式:所有初始化的成员都在构造函数主体开始之前初始化。
常量对象必须初始化,因为以后无法为它们赋值。
因此,具有常量数据成员的类必须在每个构造函数中对其进行初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)