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
现在您会注意到,当我将A初始化为B或C时,它不会触发B或C的功能。我想知道是否有解决办法?我理解这样一个概念,因为对象是A,所以它使用A \的taco函数,但是我只是想知道获取其他函数是否有技巧。我的项目相当复杂,而且我不知道所有将覆盖A的类(由于插件覆盖了一个类)。另外,我还需要基本的虚函数具有一个主体来添加默认行为。谢谢。     

解决方法

您必须将指针存储在“ 2”中,因为多态仅适用于引用和指针类型。当您将这些对象插入
deque
中时,副本的类型为
A
,将原来使它们变成
B
C
的部分“切”。 同样,
A r = B()
只是创建一个临时
B
,并将其中的
A
部分复制到称为
r
A
中。 顺便说一句by12ѭ,您也可以写下
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!
(请记住,那些对象
a
b
c
具有自动存储期限。当它们超出范围时,如果
deque
仍然存在,则其所有元素都是无效指针。您可能希望使用动态分配来进一步控制对象的生存期。
A
B
C
对象..但我将其留给读者练习。)     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...