练习15.23:
第550页程序为:
#include <iostream>
#include <string>
#include <errno.h>
using namespace std;
class Base {
public:
virtual int fcn();
};
class D1 : public Base {
public:
//隐藏了基类继承来的虚函数
int fcn(int);
//是一个新的虚函灵敏,在Base中不存在
virtual void f2();
};
class D2 : public D1 {
public:
//是一个非虚函数,隐藏了D1::fcn(int)
int fcn(int);
//覆盖了Base的虚函数fcn
int fcn();
//覆盖了D1的虚函数f2
void f2();
};
//测试
int main()
{
//调用语句
Base bobj; D1 d1Obj; D2 d2Obj;
Base* bp1 = &bobj, * bp2 = &d1Obj, * bp3 = &d2Obj;
//虚调用,将在运行时调用Base::fcn
bp1->fcn();
//虚调用,将在运行时调用Base::fcn
bp2->fcn();
//虚调用,将在运行时调用 D2::fcn
bp3->fcn();
D1* d1p = &d1Obj; D2* d2p = &d2Obj;
//错误:Base没有名为f2的成员
//bp2->f2();
d1p->f2();//虚调用,将在运行时调用D1::f12()
d2p->f2();//虚调用,将在运行时调用D2::f12()
Base* p1 = &d2Obj; D1* p2 = &d2Obj; D2* p3 = &d2Obj;
//错误:Base中没有接受一个int的fcn
//p1->fcn(42);
//静态绑定,调用D1::fcn(int)
p2->fcn(42);
//静态绑定,调用D2::fcn(int);
p3->fcn(42);
system("pause");
return 0;
}
如果需要D1类覆盖它继承来的fcn函数则需要在D1类中添加一个fcn虚函数的override版本,如下所示:
class D1 : public Base {
public:
//隐藏了基类继承来的虚函数
int fcn(int)
{
cout << "------D1 non-virtual function fcn(int)-------" << endl;
return 0;
}
//是一个新的虚函灵敏,在Base中不存在
int fcn()
{
cout << "------D1 override Base virtual function fcn()-------" << endl;
return 0;
}
virtual void f2()
{
cout << "------D1 virtual function f2()-------" << endl;
}
};
下面是效果展示
我们来测试一下效果,整体代码为:
#include <iostream>
#include <string>
#include <errno.h>
using namespace std;
class Base {
public:
virtual int fcn()
{
cout << "------Base virtual function fcn()-------" << endl;
return 0;
}
};
class D1 : public Base {
public:
//隐藏了基类继承来的虚函数
int fcn(int)
{
cout << "------D1 non-virtual function fcn(int)-------" << endl;
return 0;
}
//是一个新的虚函灵敏,在Base中不存在
int fcn()
{
cout << "------D1 override Base virtual function fcn()-------" << endl;
return 0;
}
virtual void f2()
{
cout << "------D1 virtual function f2()-------" << endl;
}
};
class D2 : public D1 {
public:
//是一个非虚函数,隐藏了D1::fcn(int)
int fcn(int)
{
cout << "------D2 non-virtual function fcn(int)-------" << endl;
return 0;
}
//覆盖了Base的虚函数fcn
int fcn()
{
cout << "------D2 override Base virtual function fcn()-------" << endl;
return 0;
}
//覆盖了D1的虚函数f2
void f2()
{
cout << "------D2 override D2 virtual function f2()-------" << endl;
}
};
//测试
int main()
{
//调用语句
Base bobj; D1 d1Obj; D2 d2Obj;
Base* bp1 = &bobj, * bp2 = &d1Obj, * bp3 = &d2Obj;
//虚调用,将在运行时调用Base::fcn
bp1->fcn();
//虚调用,将在运行时调用Base::fcn
bp2->fcn();
//虚调用,将在运行时调用 D2::fcn
bp3->fcn();
D1* d1p = &d1Obj; D2* d2p = &d2Obj;
//错误:Base没有名为f2的成员
//bp2->f2();
d1p->f2();//虚调用,将在运行时调用D1::f12()
d2p->f2();//虚调用,将在运行时调用D2::f12()
Base* p1 = &d2Obj; D1* p2 = &d2Obj; D2* p3 = &d2Obj;
//错误:Base中没有接受一个int的fcn
//p1->fcn(42);
//静态绑定,调用D1::fcn(int)
p2->fcn(42);
//静态绑定,调用D2::fcn(int);
p3->fcn(42);
system("pause");
return 0;
}
测试结果为:
达到我们的预期