描述
程序填空输出指定结果
#include <iostream>
using namespace std;
class A {
private:
int nVal;
public:
void Fun()
{ cout << "A::Fun" << endl; };
void Do()
{ cout << "A::Do" << endl; }
};
class B:public A {
public:
virtual void Do()
{ cout << "B::Do" << endl;}
};
class C:public B {
public:
void Do( )
{ cout <<"C::Do"<<endl; }
void Fun()
{ cout << "C::Fun" << endl; }
};
void Call(/* 在此处补充你的代码 */) {
p.Fun(); p.Do();
}
int main() {
C c;
Call( c);
return 0;
}
输入
无
输出
A::Fun
C::Do
样例输入
None
样例输出
A::Fun
C::Do
1. 先看第一行题目要求输出 A::Fun 这个由类A的公有函数输出的 而第二行输出 C::Do 是由类C中的Do函数输出
2. 可以发现类B中的Do函数是虚函数 类C是由类B派生而来的 所以类C中的Do函数也是虚函数 那么要输出第二行的C::Do有两种办法 一种是直接是有C类对象p p.Do()输出 第二种就是由B类引用C类对象p输出(因为在B类中Do和C类中Do是虚函数 引用C类对象 则调用C类中的Do函数)
3. 根据第一行输出A::Fun 可以知道一定是调用了 A类中的函数Fun 而A类中Fun函数不是虚函数 所以会被C类中的Fun函数覆盖掉 如果是C类对象p 那么p.Fun调用的会是C类中的函数Fun 为了输出A::Fun 则应该调用A类中的Fun函数 所以应该是B类的引用(因为B类继承了A类的公有成员函数Fun) 所以B类引用p p.Fun会输出A::Fun
答案如下:
void Call(B& p) {
p.Fun(); p.Do();
}