C++ C++;11只允许继承某些类

C++ C++;11只允许继承某些类,c++,inheritance,c++11,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

我有一个基类,我想阻止大多数类继承,但允许它用于少数我可以硬编码的类。在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

的功能,而不是让派生类成为朋友,另一种方法(可能有意义,也可能没有意义,取决于您处理的具体类)是嵌套它们

class X 
{   
    private:
        X() {}

        friend class D;
};  

class D: public X
{   
};  

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

class Base::Derived : Base {
};

class CannotDerive : Base {
};

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

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

但是,如果
B
是您有权从A继承的类之一,请使其成为
A
的朋友:

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

A::~A() {}

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

A::~A() {}

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

您可能需要继承类来实现一个或多个特定接口。您的基类是抽象的(或者可能是抽象的)?我不希望我的基类是抽象的。它只定义了一个变量,某些类需要它,而其他类则不需要。你可以向前声明派生类,与它们成为朋友,让所有构造函数都私有。@Jeremy至于实际的缺点:如果有一个类,您必须手动指定允许的继承者,那么无论出于什么原因,每次需要添加新类时,您都会重新编译整个程序。另外,如果其他人觉得有必要,他们将无法延长您的工作。