如何禁止C ++派生类派生自base,但允许来自另一个派生类

时间:2016-05-29 12:05:10

标签: c++ inheritance

鉴于这种情况:

class GrandParent {};
class Parent : public GrandParent {};
class Child : public Parent {}; /// Ok
class Child : public GrandParent {}; /// Is it possible to force a compilation error? 

2 个答案:

答案 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,编译器会给出错误