gpt4 book ai didi

C++继承虚函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:14 24 4
gpt4 key购买 nike

好的,假设我们有以下类

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 的类(由于插件覆盖了一个类)。另外,我有点需要让基本虚函数有一个主体来添加默认行为。谢谢。

最佳答案

您必须将指针存储在 deque 中,因为多态性仅适用于引用和指针类型。当您将这些对象插入 deque 时,拷贝由类型 A 组成,“切掉”使它们成为 B 的部分>C 最初。

类似地,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 对象..但我会把它作为练习留给读者。)

关于C++继承虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com