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

4

我有一个基类,希望大多数类不能继承它,但允许少数我可以硬编码的类继承。在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的功能。


5
你可以提前声明派生类,与它们建立友元关系,并将所有构造函数设为私有。 - dyp
我曾经有过类似的问题,但最终我意识到这是由于我的设计错误造成的。我可以问问你,禁止其他类继承Base2是为了防止什么? - Svalorzen
@KitsuneYMG 嗯,我不同意。我有我的理由这样做。 - jlconlin
@Jeremy 需要有非常充分的理由。你能详细说明一下吗? - Richard Hodges
1
@Jeremy 关于实际缺点:在一个必须手动指定允许继承者的类中,每次需要添加新类时都需要重新编译整个程序。此外,其他人将无法扩展您的工作,如果他们有这样的需求。 - Svalorzen
显示剩余9条评论
3个回答

5

不要让您的派生类成为朋友,另一种(根据您处理的具体类可能或不可能有意义)的方式是将它们嵌套。

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

class Base::Derived : Base {
};

class CannotDerive : Base {
};

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

4
class X 
{   
    private:
        X() {}

        friend class D;
};  

class D: public X
{   
};  

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

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.
{};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接