2014-12-23 45 views
0

我有以下方案:C++虛函數,在派生類中聲明晉升爲公衆

class Interface 
{ 
    virtual ~Interface() { } 
    virtual void foo() const = 0; 
    virtual void bar() const = 0; 
} 

//Interface is derived privately mostly for preventing upcast outside 
class Derived : private Interface 
{ 
public: 
    void foo() const; 
private: 
    void bar() const; 
} 

這並不編譯:foo是私人的。有沒有什麼辦法可以在不添加虛擬公共功能的情況下將其公開化?

+1

您無法從'Derived'調用'foo()',因爲它是私有的。你必須保護它 –

+0

它在MSVS 2013上編譯得很好。我相信OP只是在'Interface'中用'Derived'中的'foo'重寫'foo'。它沒有爲我編譯的原因是因爲'Interface'的析構函數是'private'。 – Nard

+0

這甚至不會編譯,因爲〜Interface()是私有的。 – arayq2

回答

0

沒有,沒有。

此外,即使是虛擬公共職能也需要基地中的fooprotected而不是private

我會重新審視你的設計。如果該功能是公開的,那爲什麼不是public

-1

不允許更改繼承成員的可訪問。如果允許的話,你將能夠從一個班級派生出來,並使其私人或受保護的成員公開,從而打破封裝。

2

這是完全有效的,至於語言方面,在派生類中的公共成員函數重寫基類的私有成員函數。這樣做是否是一個好主意是一個不同的問題。抽象基類沒有公共成員函數是毫無意義的。

與您的代碼的問題是,Interface有一個私人的析構函數,使其無法派生類破壞他們的基類子對象。 ~Interface()應受保護或公開。