c++编程练习 026:怎么又是Fun和Do

北大程序设计与算法(三)测验题汇总(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

AFun数和CDo函数,那么由于```A中的void Fun()函数不是虚函数,那么尽管A *p指向的是派生类C``的函数,但是由于不是虚函数,他会直接调用基类的同名函数,所以先输出A::Fun,然后呢,A中的virtual void Do()是虚函数,那么就会先调用派生类的同名函数,即类CDo函数,输出C::Do.

发布了196 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/104413303