C++ Primer(第5版) 练习 15.23
练习 15.23 假设第550页的D1类需要覆盖它继承而来的fcn函数,你应该如何对其进行修改?如果你修改之后fcn匹配了Base中的定义,则该节的那些调用语句将如何解析?
环境:Linux Ubuntu(云服务器)
工具:vim
代码块
class Base{
public:
virtual int fcn();
};
class D1: public Base{
public:
int fcn();
virtual void f2();
};
class D2: public D1{
public:
int fcn(int);
int fcn();
void f2();
};
Base bobj; D1 d1obj; D2 d2obj;
Base *bp1 = &bobj, *bp2 = &d1obj, *bp3 = &d2obj;
bp1->fcn(); //虚调用,Base::fcn
bp2->fcn(); //虚调用,D1::fcn
bp3->fcn(); //虚调用,D2::fcn
D1 *d1p = &d1obj; D2 *d2p = &d2obj;
bp2->f2(); //错误,Base没有f2成员
d1p->f2(); //虚调用,D1::f2()
d2p->f2(); //虚调用,D2::f2()
Base *p1 = &d2obj; D1 *p2 = &d2obj; D2 *p3 = &d2obj;
p1->fcn(42); //错误,Base没有接受一个int的fcn
p2->fcn(42); //错误,D1没有接受一个int的fcn
p3->fcn(42); //静态绑定,D2::fcn(int)