调用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();
}
答案 0 :(得分:7)
这是我在SO上看到的最不友好的问题。
当然你得到错误(我猜你何时调用obj1->func()
),因为你的变量是指向A
类型的对象的指针,而不是B
。所以即使你创建了一个B
,你的变量就像一个A
,因为编译器不知道它实际上是B
保存在其中。
您需要将变量更改为指向B
:B* obj1 = new B;
或者,在致电B
之前,您需要将指针指向func
:((B*)obj1)->func();
答案 1 :(得分:3)
这是一个错误,因为虽然你在运行时有一个指向派生类的指针,编译器在编译时(当它发出错误消息时)不知道这一点 - 它只知道你有一个指向基类的指针,并且基类没有此功能。因此,您必须在基础中将该函数声明为虚拟,以便编译器知道您在说什么。
顺便说一下,它是<iostream>
,而不是<iostream.h>
。