Art*_*lus 2 c++ inheritance abstract-class
在组织继承结构并需要创建基类抽象时,是否有理由更喜欢纯虚拟析构函数而不是受保护的构造函数(反之亦然)?这个问题已经存在在这里,但接受的答案并没有真正回答它.的问题
Base *ptr = new Derived();
delete ptr;
Run Code Online (Sandbox Code Playgroud)
可以使用两种方法解决:
据我了解,唯一不同的是尝试的编译器错误Base *ptr = new Base():Cannot instantiate abstract class在第一种情况下与Cannot access protected member第二种情况相比,首先是更准确.这是风格的问题,还是有些我不知道的事情?
作为一个有点相关的问题,相同的规则是否会应用于继承链中的某些类,这些类不是严格的基类,但仍然应该是抽象的(即Monster继承自GameObject无法创建,但Orc继承自Monstercan)?
如果只有default-constructor protected,您仍然可以使用隐式定义的复制构造函数创建实例:
struct ProtectedBase
{
virtual ~ProtectedBase() = default;
protected:
ProtectedBase(){}
};
struct ProtectedDerived : ProtectedBase {};
struct VirtualBase {
virtual ~VirtualBase() = 0;
};
VirtualBase::~VirtualBase() = default;
struct VirtualDerived : VirtualBase {};
int main() {
ProtectedBase a { ProtectedDerived{} }; //valid
VirtualBase b { VirtualDerived{} }; //invalid
}
Run Code Online (Sandbox Code Playgroud)
因此,您需要明确标记所有构造函数protected,包括任何隐式定义的构造函数.这似乎比简单地创建纯虚拟析构函数并实现它更多.错误地错过一些东西也容易多了.
在更概念的层面上,如果您试图使类抽象化,那么将其抽象化.只要你不长时间凝视,实现让它看起来像抽象类的东西对恕我直言并不是很有帮助.