作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在学习虚函数,我对下面程序的结果很困惑我希望 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/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!