2014-05-10 148 views
3

我有一個基類,我想阻止大多數類的繼承,但允許它爲我可以硬編碼的一些類。這可能在C++中? C++ 11更容易嗎?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

您可能需要繼承類來實現一個或多個特定接口。 –

+0

你的基類抽象(或可能是抽象的)? –

+0

我真的不希望我的基類是抽象的。它只是定義了一些類需要的變量,而不是其他類。 – jlconlin

回答

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() 
{ 
}; 
5

而不是讓你的派生類的朋友,另一種方式(這可能或可能沒有意義,取決於你正在處理的具體類),是嵌套它們。

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

class Base::Derived : Base { 
}; 

class CannotDerive : Base { 
}; 

int main() { 
    Base::Derived x; // ok 
    CannotDerive y; // error 
} 
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. 
{};