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