gpt4 book ai didi

C++虚函数混淆

转载 作者:太空狗 更新时间:2023-10-29 19:59:30 25 4
gpt4 key购买 nike

我正在学习虚函数,我对下面程序的结果很困惑我希望 a1.virFun(b1)b1.virFun(b1) 都应该返回“hello from B”,但程序返回“hello from A”。这与我的理解相反。你能解释一下为什么 b1.sayHello() 没有被调用吗,即使我将 b1 作为参数传递并且 b1.sayHello() 是虚函数。

#include<iostream>

using namespace std;

class A
{
public:
virtual void sayHello();
void virFun(A obj);

};

class B : public A
{
public:
void virFun(A obj);
virtual void sayHello();

};

void A::sayHello()
{
cout << "hello from A" << endl;
}

void B::sayHello()
{
cout <<"hello from B" << endl;
}

void A::virFun(A obj)
{
obj.sayHello();
}

void B::virFun(A obj)
{
obj.sayHello();
}

int main()
{
A a1;
B b1;

a1.virFun(b1);
b1.virFun(b1);

return 0;
}

最佳答案

void virFun(A obj);

要使虚函数起作用,您需要通过引用或指针传递对象,以确保始终使用原始对象。

void virFun(const A &obj);
void virFun(const A *obj);

否则 virFun() 将收到您的对象的拷贝,最终为 "slicing"它并丢失派生类的信息。该拷贝包含 A 的 vtable,但缺少 B 的额外字段。这通常是一场灾难。

作为一般规则,使用 T&const T& 而不是普通的 T 传递对象。除了切片问题,它也更有效率。

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

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