c ++继承虚函数

时间:2011-05-26 13:27:07

标签: c++ function virtual

好吧说我们有以下课程

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

现在你会注意到当我将A初始化为B或C时,它不会从B或C中激活函数。我想知道是否有任何解决方法?我理解这个概念,因为对象是A,它使用A的taco函数,但我只是想知道是否有一些技巧可以获得其他函数。我的项目相当复杂,我不知道所有会覆盖A的类(由于插件覆盖了一个类)。另外,我有点需要让基本虚函数有一个体来添加默认行为。感谢。

1 个答案:

答案 0 :(得分:15)

您必须在deque中存储指针,因为多态性仅适用于参考&amp;指针类型。当您将这些对象插入deque时,副本将由A类型制作,“切片”关闭最初构成BC的部分。

同样,A r = B()只会创建一个临时B,并将A部分复制到名为A的{​​{1}}。

BTW 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! ab具有自动存储持续时间。当它们超出范围时,如果c仍然存在,那么所有它的元素是无效的指针。您可能希望使用动态分配来进一步控制dequeAB对象的生命周期..但我会将其作为练习读者。)