Jim*_*imm 3 c++ inheritance virtual-functions
我正在学习有关的虚函数和我很困惑与下面的程序,我希望双方的结果a1.virFun(b1)和b1.virFun(b1)应返回"你好,从B",但该程序返回"你好,从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;
}
Run Code Online (Sandbox Code Playgroud)
void virFun(A obj);
Run Code Online (Sandbox Code Playgroud)
要使虚函数工作,您需要通过引用或指针传递对象,以确保您始终使用原始对象.
void virFun(const A &obj);
void virFun(const A *obj);
Run Code Online (Sandbox Code Playgroud)
否则virFun()将收到您的对象的副本,最终"切片"它并丢失派生类的信息.副本有Avtable,缺少B额外的字段.这通常是一场灾难.
作为一般规则,使用T&or const T&而不是plain 传递对象T.除了切片问题,它也更有效.