调用虚函数时出错

san*_*eep -2 c++

调用Derived类中定义但在Base类中不存在的虚函数时出错?当指针指向派生类时,为什么会出现此错误?

#include<iostream.h>

class A{
public:
virtual void fun()
{cout<<"A::fun()";
}
};

class B : public A
{
public:

virtual void fun()
{cout<<"B::fun()";
}
virtual void func()
{cout<<"B::func";
}
};

int main()
{
A *obj1=new B;
obj1->fun();
obj1->func();
}
Run Code Online (Sandbox Code Playgroud)

And*_*lam 7

这是我在SO上看到的最不友好的问题.

当然你得到了错误(我猜你在调用时obj1->func()),因为你的变量是一个指向类型对象的指针A,而不是B.所以,即使你已经创建了一个B,你的变量就像是A因为编译器不知道它实际上已经B保存了.

您需要将变量更改为指向B:B* obj1 = new B;

或者您需要B在调用之前将指针强制转换为func:((B*)obj1)->func();