一步一步學習C++(類)之繼承與派生

來源:互聯網
上載者:User

標籤:c++   類   

// PaiShengAndDerive.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include <string.h>class Teacher{public:Teacher(const char *s,int x,int n){strcpy(MathTeaName,s);ClassRoom = x;TeaYear = n; printf("基類建構函式!\n");}void display();protected:char MathTeaName[20]; //數學老師名字int TeaYear;private:int ClassRoom;      //教室};void Teacher::display(){printf("%d\n",ClassRoom);printf("%s\n",MathTeaName);printf("%d\n",TeaYear);}/*衍生類別*/class Student:public Teacher{public:/*衍生類別建構函式名(總參數表列): 基類建構函式名(參數表列),子物件名(參數表列)*//*Student(const char *s,int m,int n):Teacher("Li",50),Wang("Wang",45) 衍生類別的建構函式*/Student(const char *s,int m,int n,int x,int years):Teacher(s,x,years),Wang(s,x,years){strcpy(name,s);Math = m;Chinese = n;printf("衍生類別建構函式!\n");}void std_display();private:char name[20];int Math;int Chinese;Teacher Wang;//子物件};void Student::std_display(){printf("%d\n",TeaYear); //衍生類別訪問基類受保護的成員// printf("%d\n",ClassRoom);// “Teacher::ClassRoom”: 無法訪問 private 成員(在“Teacher”類中聲明)//衍生類別無法訪問基類的私人成員}int _tmain(int argc, _TCHAR* argv[]){Student std1("Li",100,100,1,50);std1.std_display();getchar();return 0;}

繼承方式包括: public(公用的),private(私人的)和protected(受保護的),此項是可選的,如果不寫此項,則預設為private(私人的)。 所謂公用的,是說所定義的變數或函數在類外可以引用,而私人的,則說明定義的變數或函數只能在類內使用,受保護的意為 不能被外界引用,但可以被衍生類別的成員引用。

Student(const char *s,int m,int n,int x,int years):Teacher(s,x,years),Wang(s,x,years)

1)執行衍生類別建構函式的順序是: 

① 調用基類建構函式,對基類資料成員初始化;

② 調用子物件建構函式,對子物件資料成員初始化;

③ 再執行衍生類別建構函式本身,對衍生類別資料成員初始化。


2)衍生類別的解構函式 

    在派生時,衍生類別不能繼承基類的解構函式,需要通過衍生類別的解構函式去調用基類的解構函式。在衍生類別中可以根據需要定義自己的解構函式,用來對衍生類別中所增加的成員進行清理。在執行衍生類別的解構函式時,系統會自動調用基類的解構函式和子物件的解構函式,對基類和子物件進行清理。調用的順序與建構函式相反: 先執行衍生類別自己的解構函式,對衍生類別新增加的成員進行清理,然後調用子物件的解構函式,最後調用基類的解構函式。


3)虛基類

從上面的學習中,我們發現如果一個衍生類別有多個直接基類,而這些直接基類又有一個共同的基類,則在最終的衍生類別中會保留該間接共同基類資料成員的多份同名成員。C++提供虛基類(virtual base class)的方法,使得在繼承間接共同基類時只保留一份成員。

class A//聲明基類A

 {…};

class B :virtual public A           //聲明類B是類A的公用衍生類別,A是B的虛基類

 {…};

class C :virtual public A           //聲明類C是類A的公用衍生類別,A是C的虛基類

 {…};

注意: 虛基類並不是在聲明基類時聲明的,而是在聲明衍生類別時,指定繼承方式時聲明的。因為一個基類可以在產生一個衍生類別時作為虛基類,而在產生另一個衍生類別時不作為虛基類。

聲明虛基類的一般形式為

class 衍生類別名: virtual 繼承方式 基類名

經過這樣的聲明後,當基類通過多條派生路徑被一個衍生類別繼承時,該衍生類別只繼承該基類一次。為了保證虛基類在衍生類別中只繼承一次,應當在該基類的所有直接衍生類別中聲明為虛基類。

如果在虛基類中定義了帶參數的建構函式,而且沒有定義預設建構函式,則在其所有衍生類別(包括直接派生或間接派生的衍生類別)中,通過建構函式的初始化表對虛基類進行初始化。

在最後的衍生類別中不僅要負責對其直接基類進行初始化,還要負責對虛基類初始化。C++編譯系統只執行最後的衍生類別對虛基類的建構函式的調用,而忽略虛基類的其他衍生類別(如類B和類C) 對虛基類的建構函式的調用,這就保證了虛基類的資料成員不會被多次初始化。


一步一步學習C++(類)之繼承與派生

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.