2015-11-21 44 views
0

看看下面的代碼:如何將抽象類轉換爲普通類而不重載純虛函數?

class A 
{ 
public: 
    virtual int getN() = 0; 
}; 

class B : public A 
{ 
private: 
    int n = 2; 
public: 
    int getN() { return n; } 
}; 
class C : public A 
{ 
    // do not contain property n, it nolonger need getN(); 
}; 

類A是一個抽象類。現在我有來自A的C類。但它不像B類有財產N。所以我不能重載getN(),然後C類是一個抽象類,我不能實例化它。 所以如果我想實例化類C,我該怎麼做?

+1

在'C'中設置'getN()'私有。 –

+1

由於A類不適合作爲C的基礎,所以A類不適合作爲C. Dang的基礎。我很聰明。 S,M,R,T。 –

+1

你的設計是錯誤的。基類應該具有所有子類感興趣的屬性。在你的例子中,你最好將getN()移動到B,因爲它不需要C – Nandu

回答

2

繼承表示「種類」關係。

由於C沒有一個getN()方法,它不能是「一種」 A因爲任何人都抱着一個A參考有權期待getN()是存在的權利。

他們擁有此權利,因爲您聲稱將getN置於公共虛擬界面A

道德故事 - 如果可以,避免繼承。優先封裝。

+0

這非常重要 - 如果你不能提供合同,*不要繼承*。 – Puppy

0

您可以嘗試將A拆分爲單獨的界面,這允許子類選擇他們希望繼承的屬性A

拿這個,例如:

class A 
{ 
public: 
    virtual int getN() = 0; 
}; 

class A1 
{ 
public: 
    virtual int getNum() = 0; 
}; 

class B : public A, public A1 
{ 
private: 
    int n = 2; 
public: 
    int getN() override { return n; } 
    int getNum() override { return 42; } 
}; 
class C : public A1 
{ 
public: 
    virtual int getNum() override { return 1; } 
}; 

這裏,C不再需要getN()所以它也需要接口既繼承。這種模式通常被稱爲interface segregation principle

相關問題