#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 函数返回类型 函数名(参数表) {函数体;}
用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数