2011-05-26 90 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对象的使用期限..但我会将其作为练习留给读者。)