c ++继承虚函数

Kel*_*ton 4 c++ virtual function

好吧说我们有以下课程

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做

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
Run Code Online (Sandbox Code Playgroud)

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

Lig*_*ica 15

您必须在指针中存储指针deque,因为多态性仅适用于引用和指针类型.当您将这些对象插入其中时deque,副本由类型组成A,"切片"掉构成它们BC最初的部分.

同样,A r = B()只需创建一个临时文件B并将其中的A一部分复制到被A调用者中r.

BTW 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!
Run Code Online (Sandbox Code Playgroud)

(请记住,这些对象a,bc具有自动存储时间.他们走出去的范围的那一刻,如果deque仍然存在,那么它的所有元素都是无效的指针,你可能要使用动态分配,以进一步控制的寿命A,B并且C物品..但我会把它作为练习留给读者.)