【cpp中的虛函數與繼承個人筆記總結】

https://www.cnblogs.com/jianyungsun/p/6361670.html

繼承:

 

繼承主要實現重用代碼,節省開發時間。

1、C#中的繼承符合下列規則:

    1. 繼承是可傳遞的。如果C從B中派生,B又從A中派生,那麼C不僅繼承了B中聲明的成員,同樣也繼承了A中的成員。Object類作爲所有類的基類。
    2. 派生類應當是對基類的擴展。派生類可以添加新的成員,但不能除去已經繼承的成員的定義。
    3. 構造函數和析構函數不能被繼承。除此之外的其它成員,不論對它們定義了怎樣的訪問方式,都能被繼承。基類中成員的訪問方式只能決定派生類能否訪問它們。
    4. 派生類如果定義了與繼承而來的成員同名的新成員,就可以覆蓋已繼承的成員。但這並不因爲這派生類刪除了這些成員,只是不能再訪問這些成員。
    5. 類可以定義虛文法、虛屬性以及虛索引指示器,它的派生類能夠重載這些成員,從而實現類可以展示出多態性。

多態:

1、“一個接口,多種方法”

同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。

  多態的三個條件:

a.    繼承的存在(繼承是多態的基礎,沒有繼承就沒有多態).
b.    子類重寫父類的方法(多態下調用子類重寫的方法).
c.    父類引用變量指向子類對象(子類到父類的類型轉換).

重載(overload)和重寫(override)是實現多態的兩種主要方式。

  2、實現多態:

      虛函數帶來的好處就是: 可以定義一個基類的指針, 其指向一個繼承類, 當通過基類的指針去調用函數時, 可以在運行時決定該調用基類的函數還是繼承類的函數. 虛函數是實現多態(動態綁定)/接口函數的基礎。用哪個派生類對象初始化基類指針,通過這個指針調用的函數就是哪個派生類的相應函數;

   虛函數的作用是允許再派生類中重新定義與基類同名的函數,並且可以通過基類指針或引用來訪問基類和派生類中的同名函數。在實際過程中 這些同名函數會創建一個指針表,然後你指針指向哪個類的對象。

  1. 接口多態性。
  2. 繼承多態性。
  3. 通過抽象類實現的多態性。

虛函數的使用方法:

(1)在基類用virtual聲明成員函數爲虛函數。這樣就可以在派生類中重新定義此函數,爲它賦予新的功能,並能方便被調用。在類外定義虛函數時,不必在定義virtual
 (2)在派生類中重新定義此函數,要求函數名,函數類型,函數參數個數和類型全部與基類的虛函數相同,並根據派
生類的需要重新定義函數體。
c++規定,當一個成員函數被聲明爲虛函數後,其派生類的同名函數都自動成爲虛函數。因此在派生類重新聲明該
虛函數時,可以加virtual,也可以不加,但習慣上一般在每層聲明該函數時都加上virtual,使程序更加清晰。
如果再派生類中沒有對基類的虛函數重新定義,則派生類簡單的繼承起基類的虛函數。 
 


#include<iostream>
#include<string>
using namespace std;

class Student
{
	public:
		Student(int , string, float);
		void display();
	protected:
		int num;
		string name;
		float score;	
};

Student::Student(int n, string na, float s)
{
	num=n;
	name=na;
	score=s;
}

void Student::display()
{
	cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<endl;
}

class Graduate:public Student
{
	public:
    		Graduate(int , string , float, float);
			void display();
	private:
			float pay;
};

Graduate::Graduate(int n, string na, float s, float p):Student(n,na,s),pay(p)
{
}

void Graduate::display()
{
	cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<"\npay:"<<pay<<endl;
}

int main()
{

	Student stud1(110,"SDL",99.8);
	Graduate grad1(120,"CCT",88.9, 250.5);
	Student *p;
	p=&stud1;
	cout<<"student:"<<endl;
	p->display();
	p=&grad1;
	cout<<"graduate:"<<endl;
	p->display();
	return 0;
} 

輸出的結果爲:

此時沒有將任何函數聲明爲虛函數,所以在Graduate類中diaplay()函數輸出時沒有pay的值,以爲p指針是Student類的,本身Student不包括pay數據。
但如果我們想輸出pay的值,只要把Student類中的display函數聲明爲虛函數即可,只要把它改爲virtual void display()聲明爲虛函數就行,輸出的結果爲:
--------------------- 

參考博客:https://www.cnblogs.com/ChenZhongzhou/p/5682776.html

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