2011-05-26 91 views
4

確定說,我們有以下類C++繼承虛函數

class A 
{ 
public: 
    virtual void taco() 
    { 
     cout << "Class A" << endl; 
    } 
}; 
class B: public A 
{ 
    public: 
    virtual void taco() 
    { 
     cout << "Class B" << endl; 
    } 
}; 
class C : public A 
{ 
    public: 
    void taco() 
    { 
     cout << "Class C" << endl; 
    } 
}; 

現在,如果我這樣做

A a = A(); 
B b = B(); 
C c = C(); 
a.taco(); //Class A 
b.taco(); //Class B 
c.taco(); //Class C 
deque<A> aa = deque<A>(); 
aa.push_back(a); 
aa.push_back(b); 
aa.push_back(c); 
for(int i=0;i<aa.size();i++) 
    aa[i].taco();//All Class A 
A r = B(); 
r.taco(); //Class A 

現在,當我初始化爲B或C,你會發現,它贏得了」 t從B或C發出函數。我想知道是否有任何解決方法?我理解這個概念,因爲對象是A,它使用A的taco函數,但我只是想知道是否有一些技巧來獲取其他函數。我的項目相當複雜,並且我無法知道將覆蓋A的所有類(由於插件覆蓋類)。另外,我還需要讓基本虛擬函數有一個主體來添加默認行爲。謝謝。

+12

使用指針並動態創建對象。 C++中的多態性需要使用指針或引用。這應該包含在任何C++教科書中 - 您正在使用哪一種教科書? – 2011-05-26 13:29:38

+3

爲什麼不把它作爲答案。 – ColWhi 2011-05-26 13:32:07

+0

Neil可能已經將它寫爲評論,但將其當作回答;-) – Pike65 2011-05-26 13:32:13

回答

15

您必須將指針存儲在deque中,因爲多態性僅適用於參考指針類型&。當您將這些對象插入deque時,副本由類型A組成,「切分」最初產生它們的部分BC

同樣,A r = B()只是創建一個臨時B並複製A部分的它變成一個A稱爲r

順便說一句A a = A();你不妨寫A a;。他們並不完全等同,但他們在這裏做同樣的工作,而且你可能意味着更簡單的版本。

A a; 
B b; 
C c; 
a.taco(); //Class A 
b.taco(); //Class B 
c.taco(); //Class C 

// With pointers and containers 
deque<A*> aa; 
aa.push_back(&a); 
aa.push_back(&b); 
aa.push_back(&c); 
for (int i=0; i<aa.size(); i++) 
    aa[i]->taco(); // Hurray!  

// With refs 
B q; 
A& r = q; 
r.taco(); // Class B! 

(請記住,這些對象abc具有自動存儲時間。他們走出去的範圍的那一刻,如果deque還是那麼它的所有元素都是無效指針的存在。你可能想使用動態分配以進一步控制ABC對象的使用期限..但我會將其作爲練習留給讀者。)