我有一个基类,我想阻止大多数类的继承,但是允许它用于一些我可以硬编码的类。这在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
的功能仍然有意义。
答案 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.
{};