2011-07-04 40 views
2

我想正確理解C++中的繼承。C++中的簡單繼承問題

首先,有一個返回實例化類的類可以嗎?

class Class1 { 
public: 
    Class1 foo(); 
} 

基本上,我有一個派生方程的類,所以它需要一個方程並返回一個方程。

如果我想的Class1的一些子類也回到自己的實例:

class Child : public Class1 { 
public: 
    Child bar(); 
} 

,我想使用一些Class 1的功能,但不是返回的Class1的,我希望回到子對象,這是繼承的可能嗎?

謝謝,希望這個問題不是太愚蠢。

+0

做一個更完整的例子,顯示你想要做什麼。 –

+0

爲什麼不嘗試一下,將代碼插入到您選擇的編譯器和實驗中。 – Vinnyq12

+0

嘿,我已經嘗試了第一個位(一個類返回本身的實例),這很好,但我想知道這是好還是不好的做法?第二,但我不知道它是如何完成的..我目前仍在玩它..將發佈任何更新。 – ale

回答

1

是,

它看起來像你對我描述了一個明確的問題,在德興模式的說法衆所周知,作爲一個Factory

考慮以下幾點:

class Class1 { 
public: 
    static Class1 * getInstance(Equation * eq); 

    virtual void foo() = 0; 
} 

class Child : public Class1 { 
public: 
    virtual void foo(); 
} 

class OtherChild : public Class1 { 
public: 
    virtual void foo(); 
} 

您將有不同的實現,把foo()方法對於這兩個孩子。

因此,舉例來說,你可以:

int main(){ 

    Equation myEquation("x=y/4"); 

    Class1 * myInstance = Class1::getInstance (&myEquation); 

    myInstance->foo(); //would call the virtual method of the child class. You don't care what subclass, this was figured out by the "getInstance" method. 

} 
1

書面,有沒有問題,但你怎麼打算使用它。價值涉及 涉及拷貝,並且拷貝和多態性一般不一起去 一起。通常(但也有例外),最好 返回一個指向新分配的實例的指針。 (如果你這樣做的話,你必須要解決 內存管理問題,如果 類的邏輯意義是不可能的,那麼你可以使用 std::shared_ptr;否則,你將不得不做其他事情。

0

首先,可以有一個類, 返回它自己的實例嗎?

是的,沒關係,在你的情況下,它聽起來像一個很好的設計。您可以擁有您提出的設計,或者您可以有不同的設計,以便您的課程可以返回不同的對象,例如, class DerivedEquation,或者你也可以有一個class Deriver這將採取Equation並返回Equation。所有這些設計都很好。

如果我想的Class1 也返回 實例本身的一些子類,我想用一些 Class 1的功能,但代替 返回的Class1的,我會想 返回子對象,將這是 可能與繼承?

這也沒關係。正如你所建議的那樣,你可以有Class1::foo()Child::bar()。此外,如果您不想擁有兩個不同的函數名稱,則可以將foo的定義更改爲Class1 * foo()Class1 & foo(),然後您將可以在Child中將其重載。