程序設計與算法(三)第06周測驗004:怎麼又是Fun和Do

程序設計與算法(三)第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;
}

輸入

輸出

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

先看主函數

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

emmm,兩個Call函數,其中參數是新建的類AC的對象

void Call(
// 在此處補充你的代碼
) {
	p->Fun(); p->Do();
}

看看類

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; }
};
派生
派生
A
B
C

輸出是

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

注意,主函數裏的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();
}

這樣寫的話,Do()函數的調用是正常的。當Call( new C());時,因爲指針是A *,故調用的是A.Fun(),與輸出相符

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

提交,通過

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章