为什么指向派生类对象的基类指针仍指向基类函数,如果函数未声明为虚函数
class Base
{
public:
void draw() { cout << "base" << endl; }
virtual void fun() { cout << "base class function" << endl; }
};
class Derived : public Base
{
public:
void draw() { cout << "derived" << endl; }
void fun() { cout << "derived function" << endl; }
};
int main()
{
Derived d;
d.draw(); //derived
Base *b = &d;
b->draw(); //base
b->fun(); //derived function
return 0;
}
b
是一个指向派生对象的指针,即使那么b->draw()
为什么输出为“base”而不是“派生”?
答案 0 :(得分:1)
该函数必须被virtual
覆盖。这就是virtual
的意思:它可以重载。
答案 1 :(得分:1)
在C ++中,非虚函数类函数和类变量(即实例变量或字段)由指针类调用,而不是对象类。默认情况下,Java方法是虚拟的
答案 2 :(得分:0)
虚拟关键字的重点是决定是否在派生类中重新定义函数意味着:
在第二种情况下,您调用的实际功能是:
d.draw();
b->draw();
由您调用它的对象的编译时类型定义,即Base实例将调用Base :: draw,而Derived实例将调用Derived :: draw。请注意,您还可以使用以下命令静态调用具有相同名称的基本定义方法:
d.Base::draw();