基类指针指向普通和虚函数

时间:2014-02-13 09:54:17

标签: c++ pointers inheritance

为什么指向派生类对象的基类指针仍指向基类函数,如果函数未声明为虚函数

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”而不是“派生”?

3 个答案:

答案 0 :(得分:1)

该函数必须被virtual覆盖。这就是virtual的意思:它可以重载。

答案 1 :(得分:1)

在C ++中,非虚函数类函数和类变量(即实例变量或字段)由指针类调用,而不是对象类。默认情况下,Java方法是虚拟的

答案 2 :(得分:0)

虚拟关键字的重点是决定是否在派生类中重新定义函数意味着:

  • 虚拟:现有功能界面的实际重新定义
  • 非虚拟:只是另一个具有相同签名的无关成员函数

在第二种情况下,您调用的实际功能是:

d.draw();
b->draw();

由您调用它的对象的编译时类型定义,即Base实例将调用Base :: draw,而Derived实例将调用Derived :: draw。请注意,您还可以使用以下命令静态调用具有相同名称的基本定义方法:

d.Base::draw();