Box myBox{ 2.0, 3.0, 4.0 };
//声明一个派生类的箱子(成员变量大小相同)
CGlassBox myClassBox{ 2.0, 3.0, 4.0 };
//创建一个基类CBox对象的指针
CBox* pBox{};
//指针指向基类
pBox = &myBox;
//调用函数showVolume
pBox->showVolume();
//指针指向派生类
pBox = &myClassBox;
pBox->showVolume();
system("pause");
return 0;
}
运行结果:
CBox的体积是24
CBox的体积是20.4
输出与上一个示例的输出完全相同,在上一个示例中,我们在函数调用中使用了显式的对象。从本示例可以得出这样的结论:虚函数机制借助于指向基类的指针同样能够正常工作,实际调用的函数是基于被指向的对象类型而选择的。
即使我们不知道程序中某个基类指针所指对象的准确类型(例如,某个指针作为实参传递给函数时),虚函数机制也能确保调用正确的函数(例如,某个指针作为实参传递给函数时)。这是一种特别强大的功能,因此,务必充分理解。多态性是一种我们将多次使用的基本C++机制。
6.使用引用处理虚函数
如果定义一个形参为基类引用的函数,则可以给该函数传递派生类的对象作为实参。该函数在执行时,将自动为传递进来的对象选择适当的虚函数。我们将上一个示例中的main()函数修改成调用一个形参为引用的函数,就可以看到这种情况。
同样仅修改 新建项目名称.cpp文件:
void output(const CBox& aBox); //声明一个传引用函数
int _tmain(int argc, _TCHAR* argv[])
{
//声明一个CBox
CBox myBox{ 2.0, 3.0, 4.0 };
//声明一个派生类的箱子(成员变量大小相同)
CGlassBox myClassBox{ 2.0, 3.0, 4.0 };
//调用函数
output(myBox);
output(myClassBox);
system("pause");
return 0;
}
void output(const CBox& aBox)
{
aBox.showVolume();
}
运行结果:
CBox的体积是24
CBox的体积是20.4
main()函数现在由两次对output()函数的调用组成,第一次用基类对象作为实参,第二次用派生类对象作为实参。因为形参是基类的引用,所以output()函数可以接受这两种类对象实参,并根据初始化引用的对象种类,调用适当的虚函数volume();
虚函数机制确实能够借助于引用形参起作用。多态机制可用于指针和引用。