运行代码:
//为D1定义一个f()函数,重做练习1-3,并解释其结果
#include"std_lib_facilities.h"
//----------------------------------------------------------------------
//定义B1类。
class B1
{
public:
virtual void vf() { cout<< "B1::vf()\n"; }
void f() { cout<< "B1::f()\n"; }
};
//----------------------------------------------------------------------
//定义派生自B1的D1类
class D1 : public B1
{
public:
void vf() { cout << "D1::vf()\n"; }
void f() { cout << "D1::f()\n"; }
};
//-----------------------------------------------------------------------
//定义一个B1的引用
void call( B1& b1)
{
b1.vf();
b1.f();
}
//-----------------------------------------------------------------------
int main()
try{
B1 b1;
b1.vf();
b1.f();
D1 d1;
d1.vf();
d1.f();
call(d1);
}
catch (exception& e) {
cerr << "error:" << e.what() << '\n';
keep_window_open();
return 1;
}
catch (...) {
cerr << "Oops:unknown exception!\n";
keep_window_open();
return 2;
}
//-----------------------------------------------------------------------
运行结果:
运行结果的解释:
每个类型的对象调用自己类型的函数;当函数参数为基类,而调用时参数为其派生类,则如果有虚函数的话,调用被覆盖的虚函数。如果没有虚函数,则调用基类函数。