首页 > 技术文章 > c++中的虚函数

kaituorensheng 原文

#include <iostream>
#include <string>
using namespace std;

class Base
{
    public:
        virtual void print_val()
        {
            cout << "base" << endl;
        }
};
class Derived : public Base
{
    public:
        void print_val()
        {
            cout << "Derived" << endl;
        }
};

int main()
{
    Derived d;
    Base ob(d);
    Base *pb = &d;
    Base &yb = d;
    ob.print_val();
    pb->print_val();
    yb.print_val();
}

运行结果

现象

程序用了三种方式来测试虚函数的调用:基类对象、基类指针、基类引用。由结果可以看出,当用引用、指针调用虚函数是调用的是派生类的实际函数,而不是基类的虚函数。

结论

  • 当通过基类的对象直接调用虚函数时,总是调用该对象所属的函数。所以ob是基类的对象,调用的是基类的实例
  • 当使用指向基类的指针或引用调用时,将动态绑定虚函数,即调用该指针或引用所指的类型定义的函数。pb是指向基类对象的指针,但是实际指向的是派生类对象,所以调用派生类的实例

对比

#include <iostream>
#include <string>
using namespace std;

class Base
{
    public:
        void print_val()
        {
            cout << "base" << endl;
        }
};
class Derived : public Base
{
    public:
        void print_val()
        {
            cout << "Derived" << endl;
        }
};

int main()
{
    Derived d;
    Base ob(d);
    Base *pb = &d;
    Base &yb = d;
    ob.print_val();
    pb->print_val();
    yb.print_val();
}

结果

总结

定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数
语法:virtual 函数返回类型 函数名(参数表) {函数体;}
用途实现多态性,通过指向派生类基类指针,访问派生类中同名覆盖成员函数

推荐阅读