2010-03-23 75 views
3

好吧,我作爲一個程序員很缺乏經驗,更不用說C++了,所以請忍受我在這裏。我想要做的是讓一個容器類擁有一個父類指針,然後使用多態性來存儲一個子類對象。問題是我想通過父類指針調用其中一個子類的函數。這裏有一種例子說明我的意思代碼:C++多態,函數調用

class SuperClass 
{ 
public: 
    int x; 
} 

class SubClass : public SuperClass 
{ 
public: 
    void function1() 
    { 
     x += 1; 
    } 
} 

class Container 
{ 
public: 
    SuperClass * alpha; 
    Container(SuperClass& beta) 
    { 
     alpha = beta; 
    } 
} 

int main() 
{ 
    Container cont = new Container(new SubClass); 
} 

(我不知道這是正確的,我還真是不穩固的三分球,我希望它橫跨得到的地步,至少。)

所以,我不完全確定我是否可以做到這一點。我有一個偷偷摸摸的懷疑,答案是否定的,但我想確定。如果有人有另一種方法來完成這種事情,我很樂意聽到它。

+0

呼叫孩子的功能在哪裏? (你是否想把function1()放在某處?) – 2010-03-23 17:27:15

+0

多態意味着從派生類中覆蓋的基類中調用一個函數。僅在派生類中定義的調用函數顯示設計問題。你可能想在這種情況下投。 – stefaanv 2010-03-23 19:09:32

+0

@stefaanv這些需要演員陣容的「設計問題」表明應該找到演員以外的解決方案! :) – 2010-04-06 01:34:35

回答

6

絕對有可能。只需對代碼進行一些小的更改即可實現此功能。 您需要將基類(SuperClass)更改爲具有與派生類(SubClass)具有相同「簽名」的虛擬方法。您還需要更改Container構造函數以將指針指向SuperClass而不是引用。我相信這是使這項工作發揮作用所必需的。

編輯:試圖在評論中包含建議。好點。希望我沒有太糟糕地搞砸了!

class SuperClass 
{ 
public: 
    int x; 

    // virtual destructor ensures that the destructors of derived classes are also 
    // invoked 
    virtual ~SuperClass() { } 

    // abstract virtual method to be overriden by derived classes 
    virtual void function1() = 0; 
} 

class SubClass : public SuperClass 
{ 
public: 
    ~SubClass() 
    { 
    } 

    void function1() 
    { 
     x += 1; 
    } 
} 

class Container 
{ 
public: 
    SuperClass * alpha; 
    Container(SuperClass* beta) 
    { 
     alpha = beta; 
    } 

    ~Container() 
    { 
     // Note, this will invoke the destructor of the SubClass class because 
     // SuperClass's destructor is marked as virtual. 
     delete alpha; 
    } 
} 

int main() 
{ 
    Container* cont = new Container(new SubClass()); 
    delete cont; 
} 
+2

我想指出的是,如果function1只是由子類定義的,你可能想要聲明爲'virtual void function1()= 0;'這使得SuperClass抽象並且要求它被實現在子類,強制多態。 – Matt 2010-03-23 17:30:42

+0

另請注意,該示例泄漏了一個子類和一個容器。 – Fozi 2010-03-23 17:33:36

+0

它不是真的泄漏,如果它持續到程序結束,但應該有一個'容器'析構函數像'〜Container(){delete alpha; }'。當然,假設'Container'擁有它指向的'SuperClass'或'SubClass'。 – 2010-03-23 17:39:20

0

你得改線:

Container(SuperClass& beta) 

Container(SuperClass* beta)

哎呀,我忘了虛擬的。