我有一个这样定义的纯虚拟类:
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++ 解决方案相混淆?
感谢大家的帮助。