c ++虚函数混淆

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)

Joh*_*ica 6

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.除了切片问题,它也更有效.