首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++继承虚函数

c++继承虚函数
EN

Stack Overflow用户
提问于 2011-05-26 21:27:07
回答 1查看 1.3K关注 0票数 4

好的,假设我们有以下类

代码语言:javascript
复制
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;
    }
};

现在如果我这样做

代码语言:javascript
复制
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的所有类(由于插件覆盖了一个类)。此外,我还需要让基本虚函数有一个主体来添加默认行为。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-26 21:32:20

您必须将指针存储在deque中,因为多态性只适用于引用和指针类型。当您将这些对象插入到deque中时,会生成A类型的副本,“切片”掉最初使它们成为BC的部分。

类似地,A r = B()只创建一个临时B,并将其A部分复制到一个名为rA中。

顺便说一句,你也可以写A a;。它们不是完全等价的,但在这里它们做的是相同的工作,您可能指的是更简单的版本。

代码语言:javascript
复制
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对象的生存期。但我将把它作为练习留给读者。)

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6139240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档