调用虚函数时出错

时间:2010-03-25 09:42:01

标签: 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();
}

2 个答案:

答案 0 :(得分:7)

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

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

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

或者,在致电B之前,您需要将指针指向func((B*)obj1)->func();

答案 1 :(得分:3)

这是一个错误,因为虽然你在运行时有一个指向派生类的指针,编译器在编译时(当它发出错误消息时)不知道这一点 - 它只知道你有一个指向基类的指针,并且基类没有此功能。因此,您必须在基础中将该函数声明为虚拟,以便编译器知道您在说什么。

顺便说一下,它是<iostream>,而不是<iostream.h>