2017-08-28 76 views
0

我有關於繼承的問題。我的情況是這樣的:使用派生類C++的方法的超類

我有兩個類(AThisWay,AThatWay),我希望能夠隨時更換。他們都有相同的方法名稱,但在方法內部做了不同的事情。他們的屬性和方法被其他類使用(B)。 在開始時我只有AThisWay,它是B的超類,但現在我也有AThatWay,我想知道是否有可能使AThisWay和AThatWay成爲子類ob B,這樣我就不會對屬性產生困惑,或者如果有一種方法可以隨時改變B的超類。這方面的最佳做法是什麼?

最佳 聖

編輯: 現在我做這種方式(注②僅從AThisWay派生),但我想B到也能夠有時使用AThatWay的方法。就像AThisway和AThatWay是我的不同物理模型一樣,我希望能夠這樣做我的微積分,有時候這樣做只是爲了測試我的模型。我現在看到的最快的方法是複製B並從AThatWay中派生出來,但這當然不是很好,也不容易調試。

class AThisWay { 
public: 
    int aNumber 
    void aMethod() { aNumber = 1; } 
} 

class AThatWay { 
public: 
    int aNumber 
    void aMethod() { aNumber = 2; } 
} 

class B: public AThisWay{ 
public: 
    int anOtherNumber 
    void otherMethod() 
     { 
     aMethod(); 
     anOtherNumber = aNumber + 2; 
     } 
} 
+5

閱讀起來多態性,虛擬和重寫函數以及派生類的基類指針。 – Ron

+0

「基類指向派生類」是唯一的選擇,還是有辦法告訴B在構造它時使用了什麼超類?^從B派生A更聰明嗎?就像那樣,如果沒有它的子類,那麼B類就不能做任何事情。 –

+1

聽起來像你需要* interface A *,被* class B *使用,並由那些* AXxxXxx *類實現。 (是的,即使沒有明確的關鍵字,C++也支持接口的概念)。 – hyde

回答

1

我可能無法正確得到它,你通過「交換不時」的意思,但在我看來,你應該建立一個共同的基類的AThisWayAThatWay,並讓班B通過使用他們的共同基礎。這樣你就不必從任何這些類中派生出來。

class AWay { 
public: 
    virtual void method() = 0; 
} 

class AThisWay : public AWay { 
public: 
    virtual void method() override { /* code A */ } 
} 
class AThatWay : public AWay { 
public: 
    virtual void method() override { /* code B */ } 
} 

B類:

class B { 
public: 
    B(bool isThat) { 
     if (isThat) aWay = new AThatWay(); 
     else aWay = new AThisWay(); 
    } 

    void bar() { aWay->method(); } 
private: 
    AWay *aWay = nullptr; 
} 

(上面的例子中忽略了像一些細節:動態內存的釋放,這將是更好地使用智能指針等)

+0

這可以工作,但我想保留派生類相互派生,因爲派生類是我的模型的擴展。那有意義嗎? –

+0

如果你想保持這種結構,你可以。構成只是另一種做同樣事情的方式。不知道整個情況很難確定什麼是最好的。以下是關於該主題及其缺陷的[文章](http://www.cprogramming.com/tutorial/multiple_inheritance.html)。 – nothingam