https://www.cnblogs.com/jianyungsun/p/6361670.html
繼承:
繼承主要實現重用代碼,節省開發時間。
1、C#中的繼承符合下列規則:
-
- 繼承是可傳遞的。如果C從B中派生,B又從A中派生,那麼C不僅繼承了B中聲明的成員,同樣也繼承了A中的成員。Object類作爲所有類的基類。
- 派生類應當是對基類的擴展。派生類可以添加新的成員,但不能除去已經繼承的成員的定義。
- 構造函數和析構函數不能被繼承。除此之外的其它成員,不論對它們定義了怎樣的訪問方式,都能被繼承。基類中成員的訪問方式只能決定派生類能否訪問它們。
- 派生類如果定義了與繼承而來的成員同名的新成員,就可以覆蓋已繼承的成員。但這並不因爲這派生類刪除了這些成員,只是不能再訪問這些成員。
- 類可以定義虛文法、虛屬性以及虛索引指示器,它的派生類能夠重載這些成員,從而實現類可以展示出多態性。
多態:
1、“一個接口,多種方法”
同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。
多態的三個條件:
a. 繼承的存在(繼承是多態的基礎,沒有繼承就沒有多態).
b. 子類重寫父類的方法(多態下調用子類重寫的方法).
c. 父類引用變量指向子類對象(子類到父類的類型轉換).
重載(overload)和重寫(override)是實現多態的兩種主要方式。
2、實現多態:
虛函數帶來的好處就是: 可以定義一個基類的指針, 其指向一個繼承類, 當通過基類的指針去調用函數時, 可以在運行時決定該調用基類的函數還是繼承類的函數. 虛函數是實現多態(動態綁定)/接口函數的基礎。用哪個派生類對象初始化基類指針,通過這個指針調用的函數就是哪個派生類的相應函數;
虛函數的作用是允許再派生類中重新定義與基類同名的函數,並且可以通過基類指針或引用來訪問基類和派生類中的同名函數。在實際過程中 這些同名函數會創建一個指針表,然後你指針指向哪個類的對象。
- 接口多態性。
- 繼承多態性。
- 通過抽象類實現的多態性。
虛函數的使用方法:
(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()聲明爲虛函數就行,輸出的結果爲:
---------------------