北大程序设计与算法(三)测验题汇总(2020春季)
描述
程序填空输出指定结果
#include <iostream>
using namespace std;
class A {
private:
int nVal;
public:
void Fun()
{ cout << "A::Fun" << endl; };
virtual 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() {
Call( new A());
Call( new C());
return 0;
}
输入
无
输出
A::Fun
A::Do
A::Fun
C::Do
样例输入
无
样例输出
A::Fun
A::Do
A::Fun
C::Do
来源
Guo Wei
分析
我们分析一下代码,类A
是基类,类B
是类A
的派生类,类C
是类B
的派生类。
Call( new A());
void Call(
// 在此处补充你的代码
) {
p->Fun(); p->Do();
}
此处首先想到的就是
void Call(A *p) {
p->Fun(); p->Do();
}
因为下面用到的p
是指针,那么肯定定义的是指针,然后是 类A
,所以填(A *p
,
再者
Call( new C());
oid Call(A *p) {
p->Fun(); p->Do();
}
现在此处是类C
,用A
定义肯定是可以的,因为A
是基类嘛,但是会怎么运行呢?
后者的输出是
A::Fun
C::Do
是A
的Fun
数和C
的Do
函数,那么由于```A中的
void Fun()函数不是虚函数,那么尽管
A *p指向的是派生类
C``的函数,但是由于不是虚函数,他会直接调用基类的同名函数,所以先输出A::Fun
,然后呢,A
中的virtual void Do()
是虚函数,那么就会先调用派生类的同名函数,即类C
的Do
函数,输出C::Do
.