詳解C++編程中多級派生時的結構函數和拜訪屬性。本站提示廣大學習愛好者:(詳解C++編程中多級派生時的結構函數和拜訪屬性)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++編程中多級派生時的結構函數和拜訪屬性正文
C++多層派生時的結構函數
一個類不只可以派生出一個派生類,派生類還可以持續派生,構成派生的條理構造。在下面論述的基本上,不難寫出在多級派生情形下派生類的結構函數。
經由過程例上面的法式,讀者可以懂得在多級派生情形下如何界說派生類的結構函數。信任年夜家完整可以本身看懂這個法式。
[例] 多級派生情形下派生類的結構函數。
#include <iostream> #include<string> using namespace std; class Student//聲明基類 { public://公用部門 Student(int n, string nam)//基類結構函數 { num=n; name=nam; } void display( )//輸入基類數據成員 { cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; } protected://掩護部門 int num;//基類有兩個數據成員 string name; }; class Student1: public Student//聲明公用派生類Student1 { public: Student1(int n,char nam[10],int a):Student(n,nam)//派生類結構函數 {age=a;}//在此處只對派生類新增的數據成員初始化 void show( ) //輸入num,name和age { display( ); //輸入num和name cout<<"age: "<<age<<endl; } private://派生類的公有數據 int age; //增長一個數據成員 }; class Student2:public Student1 //聲明直接公用派生類Student2 { public://上面是直接派生類結構函數 Student2(int n, string nam,int a,int s):Student1(n,nam,a) {score=s;} void show_all( ) //輸入全體數據成員 { show( ); //輸入num和name cout<<"score:"<<score<<endl; //輸入age } private: int score; //增長一個數據成員 }; int main( ) { Student2 stud(10010,"Li",17,89); stud.show_all( ); //輸入先生的全體數據 return 0; }
運轉時的輸入以下:
num:10010 name:Li age:17 score:89
請留意基類和兩個派生類的結構函數的寫法。
基類的結構函數首部:
Student(int n, string nam)
派生類Student1的結構函數首部:
Student1(int n, string nam],int a):Student(n,nam)
派生類Student2的結構函數首部:
Student2(int n, string nam,int a,int s):Student1(n,nam,a)
留意不要寫成:
Student2(int n, string nam,int a,int s):Student1(n,nam),student1(n, nam, a)
不要列出每層派生類的結構函數,只需寫出其上一層派生類(即它的直接基類)的結構函數便可。在聲明Student2類對象時,挪用Student2結構函數;在履行Student2結構函數時,先挪用Student1結構函數;在履行Student1結構函數時,先挪用基類Student結構函數。初始化的次序是:
先初始化基類的數據成員num和name。
再初始化Student1的數據成員age。
最初再初始化Student2的數據成員score。
C++類多級派生時的拜訪屬性
在現實項目開辟中,常常會有多級派生的情形。如圖11.9所示的派生關系:類A為基類,類B是類A 的派生類,類C是類B的派生類,則類C也是類A的派生類;類B稱為類A 的直接派生類,類C稱為類A的直接派生類;類A是類B的直接基類,是類 C的直接基類。
在多級派生的情形下,各成員的拜訪屬性仍按以上准繩肯定。
為了把多重繼續說的加倍具體,請年夜家先看上面的幾個繼續的類。
[例] 假如聲清楚明了以下的類:
class A //基類 { public: int i; protected: void f2( ); int j; private: int k; }; class B: public A //public方法 { public: void f3( ); protected: void f4( ); private: int m; }; class C: protected B //protected方法 { public: void f5( ); private: int n; };
類A是類B的公用基類,類B是類C的掩護基類。各成員在分歧類中的拜訪屬性以下:
依據以上剖析,在派生類C的裡面只能拜訪類C的成員函數f5,不克不及拜訪其他成員。 派生類C的成員函數f5能拜訪基類A的成員i、f2、j和派生類B的成員f3、f4。派生類B 的成員函數f3、f4能拜訪基類A的成員i、f2和j。
經由過程以上剖析,可以看到:不管哪種繼續方法,在派生類中是不克不及拜訪基類的公有成員的,公有成員只能被本類的成員函數所拜訪,究竟派生類與基類不是統一個類。
假如在多級派生時都采取公用繼續方法,那末直到最初一級派生類都能拜訪基類的公用成員和掩護成員。
假如采取公有繼續方法,經由若干次派生以後,基類的一切的成員曾經釀成弗成拜訪的了。
假如采取掩護繼續方法,在派生類外是沒法拜訪派生類中的任何成員的。
並且經由屢次派生後,人們很難清晰地記住哪些成員可以拜訪,哪些成員不克不及拜訪,很輕易失足。是以,在現實中,經常使用的是公用繼續。