程序设计与算法(三)第06周测验004:怎么又是Fun和Do

举报
陈沧夜 发表于 2022/04/30 23:00:22 2022/04/30
【摘要】 程序设计与算法(三)第06周测验004:怎么又是Fun和Do 本文是中国大学MOOC,北京大学程序设计与算法(三)C++面向对象程序设计第六周测验。本课程学习的github仓库欢迎Fork 总时间限制...

程序设计与算法(三)第06周测验004:怎么又是Fun和Do

本文是中国大学MOOC,北京大学程序设计与算法(三)C++面向对象程序设计第六周测验。本课程学习的github仓库欢迎Fork

总时间限制:

1000ms

内存限制:

65536kB

描述

程序填空输出指定结果

#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;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

输入

输出

A::Fun
A::Do
A::Fun
C::Do

  
 
  • 1
  • 2
  • 3
  • 4

先看主函数

int main() {
	Call( new A());
	Call( new C());
	return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

emmm,两个Call函数,其中参数是新建的类AC的对象

void Call(
// 在此处补充你的代码
) {
	p->Fun(); p->Do();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

看看类

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; }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
派生
派生
A
B
C

输出是

A::Fun	//A.Fun()输出
A::Do	//A.Do()
A::Fun	//A.Fun()
C::Do	//C.Do()

  
 
  • 1
  • 2
  • 3
  • 4

注意,主函数里的Call的参数是new一个新的空间。所以我们必须用指针,不可以用&

但是这里怎么会出现A::Fun()呢?

因为我们看到Do()函数是虚函数,A,B,C类里的Do都是虚函数,所以哪个类运行的Do函数,调用的就是哪个类的Do

Fun()就不一样了,只有在AC中有。

想要输出A::Fun(),那么我们只能这样写

A *p

void Call(A *p) {
	p->Fun(); p->Do();
}

  
 
  • 1
  • 2
  • 3

这样写的话,Do()函数的调用是正常的。当Call( new C());时,因为指针是A *,故调用的是A.Fun(),与输出相符

A * p指向C是可以的,因为CA的派生

提交,通过

文章来源: blog.csdn.net,作者:沧夜2021,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/CANGYE0504/article/details/105362501

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。