鉴于这种情况:
class GrandParent {};
class Parent : public GrandParent {};
class Child : public Parent {}; /// Ok
class Child : public GrandParent {}; /// Is it possible to force a compilation error?
答案 0 :(得分:39)
将GrandParent
构造函数设为私有,Parent
为朋友。
class GrandParent
{
friend class Parent;
private:
GrandParent() {}
// ...
};
或者,您可以通过将析构函数设为私有来权衡GrandParents
的多态破坏:
class GrandParent
{
friend class Parent;
private:
virtual ~GrandParent() {}
};
// Invalid Destruction:
GrandParent* p = new Parent;
...
delete p;
答案 1 :(得分:0)
解决此问题的另一种方法是使用"模板魔法"。 您应该在Child类声明之后添加此代码:
#include <type_traits>
class Child : public Parent
{
};
static_assert(std::is_base_of<Parent, Child>::value, "Child must derive Parent");
如果尝试将Parent类更改为GrandParent,编译器会给出错误