C ++ 11仅允许继承某些类

时间:2014-05-10 12:51:33

标签: c++ inheritance c++11

我有一个基类,我想阻止大多数类的继承,但是允许它用于一些我可以硬编码的类。这在C ++中是否可行?使用C ++ 11会更容易吗?

我想也许我会使用final参数,但这会阻止任何继承。

// This can be derived by anyone
class Base{
...
}

// This should only be derived by those I say can derive it
class Base2: public Base{
    protected:
         int SpecialVar;
}

我想要的原因是某些类需要访问SpecialVar,而对其他类没有意义。所有类都具有Base的功能仍然有意义。

3 个答案:

答案 0 :(得分:5)

不是让你的派生类成为朋友,而是另一种方式(根据你正在处理的具体类别可能有意义也可能没有意义),就是嵌套它们。

class Base {
    Base() { }
public:
    class Derived;
};

class Base::Derived : Base {
};

class CannotDerive : Base {
};

int main() {
    Base::Derived x; // ok
    CannotDerive y; // error
}

答案 1 :(得分:3)

class X 
{   
    private:
        X() {}

        friend class D;
};  

class D: public X
{   
};  

class Y: public X // will fail, because it can't access X::X()
{   
};  

答案 2 :(得分:0)

其他可能性是使用私有析构函数(特别是如果A是抽象类,因为您不需要A的实例):

class A
{
  private:
     virtual ~A() = 0;
};

A::~A() {}

class B : public A // Compilation error: ~A() is private.
{};

但是,如果B是您的某个有权从A继承的类,请将其设为A的朋友:

class A
{
  private:
     friend class B;
     virtual ~A() = 0;
};

A::~A() {}

class B : public A // Fine.
{};