C 中的繼承方式和使用說明

2021-10-05 17:34:52 字數 4774 閱讀 5628

繼承,是從已經存在的類中獲得屬性,再此基礎之上新增自己屬性的過程。原有的類成為基類或父類,產生的新類則為派生類或子類。

class deriveclass:derivemode baseclass

當然也可以從多個基類中進行派生,此時叫多重繼承。從乙個基類中進行派生,稱為單繼承。

成員\繼承方式

public

protected

private

public

public

protected

private

protected

protected

protected

inaccessable

private

inaccessable

inaccessable

inaccessable

派生類建構函式分為兩部分,一部分是從基類繼承來的成員的初始化,此部分初始化由基類的建構函式完成,另一部分則是派生類自身的成員,此部分初始化由派生類的建構函式完成。

deriveclass::dericeclass(argument):baseclass(argument),var(argument)

// myclass.h

#ifndef myclass_h

#define myclass_h

using std::cout;

using std::endl;

class person

結果為:

person(char * name_ = "***",char ***_ = '*')

club(char * name_ = "***"):name(name_)

student(char * name_ = "***",char ***_ = '*',char *num_ = "***",char * club_ = "***")

job(char * name_ = "***"):name(name_)

postgraduate(char * name_ = "***",char ***_ = '*',char *num_ = "***",char * club_ = "***",char *job_ = "***",int salary_ = 0)

the person name is zhangsan.

the person *** is x.

the club name is 100.

the student num is math.

the job name is *****.

the postgarduate saraly is 100.

~postgraduate()

~job()

~student()

~club()

~person()

在上邊的例子中,我們構造了兩個基類 person 和 job,其中 person 派生出 student,student 和 job 派生出 postgraduate,在 student 中還存在乙個 club 的成員,從上邊的結果可以看出:

deriveclass::deriveclass(const deriveclass &obj):baseclass(obj),deriveclass_var(obj.var)

#include using namespace std;

class person

#include using namespace std;

class person

void displayp()

void displays()

結果為:

person(char * name_ = "***",char ***_ = '*')

student(char *name_ = "***",char ***_ = '*',char *num_ = "***")

the person name is zhangsan.

the person *** is x.

the student num is 100.

person(const person &obj)

student(const student &obj)

the person name is zhangsan.

the person *** is x.

the student num is 100.

~student()

~person()

~student()

~person()

可以發現在前者的實現中,並沒有呼叫賦值運算子過載函式。可以理解為只有當物件存在時才能夠呼叫運算子過載函式。

之前我們說過友元函式可以是全域性函式或者類函式,但兩者均不是類的成員函式,因此不能夠被繼承。但通過強制型別轉換,將派生類的指標或者引用強制轉換為基類的指標或者引用,然後就可以使用轉換後的指標或者引用呼叫基類中的友元函式。

#include using namespace std;

class person

void displayp()

void displays()

person(const person &obj):name(obj.name),***(obj.***){}

void display()

deriveclass::deriveclass(argument):baseclass1(argument),baseclass2(argument),classmember1(argument),classmember2(argument),...

在最初的例子中,我們就簡單說到過多繼承的問題:

// myclass.h

#ifndef myclass_h

#define myclass_h

using std::cout;

using std::endl;

class person

void display();

private:

char * name;

char ***;

};class club

void display();

private:

char * name;

};class student:public person,public club

student(person person_,club club_,char *num_ = "***"):person(person_),club(club_),num(num_){}

void display();

private:

char *num;

};#endif // myclass_h

// myclass.cpp

#include #include "myclass.h"

using std::cout;

using std::endl;

void person::display()

結果為:

the person name is zhangsan.

the person *** is x.

the club name is math.

the student num is 100.

上邊的例子中,student 類繼承了 person 和 club 類,兩個類中都含有 sidplay 函式,因此在這種問題中如果想要呼叫某個類中的該函式時,需要加上作用域運算子進行限定。

上邊的例子中說明的是上圖左邊的情況,此種情況下,派生類的基類之間沒有發生過交叉。但是如果是右圖中的繼承關係,就有點不太一樣了,此時 b 中含有 a 的成員,c 中也含有 a 的成員,d 同時含有 b 和 c 的成員,也就說含有 a 的兩份成員,這樣的情況是需要避免的。

#include using namespace std;

class a

int data;

};class b:public a

void setdata(int i)

};class c:public a

int getdata()

};class d:public b,public c

void dis()

int data;

};class b:virtual public a

void setdata(int i)

};class c:virtual public a

int getdata()

};class d:public b,public c

void dis()

需要在交叉點處(上例為 d)為虛基類構建引數初始化列表。

d():b(2),c(3),a(10){}
虛繼承作為繼承方式的一種擴充套件,可以避免特殊繼承結構之間造成的多重資料成員問題,有效避免程式的二義性。

C 中vector使用說明

1.在c 中的詳細說明 vector是c 標準模板庫中的部分內容,它是乙個多功能的,能夠操作多種資料結構和演算法的模板類和函式庫。vector之所以被認為是乙個容器,是因為它能夠像容器一樣存放各種型別的物件,簡單地說,vector是乙個能夠存放任意型別的動態陣列,能夠增加和壓縮資料。2.使用vect...

c 中冒號 和雙冒號 的使用說明

1 表示機www.cppcns.com構内位域的定義 即該變數佔幾個bit空間 複製 如下 typedef struct 2 建構函式後面的冒號起分割作用,是類給成員變數賦值的方法,初始化列表,更適用於成員變數的常量const型。複製 如下 struct sqppyt 3 public 和priva...

C 中map容器的使用說明

c 中map容器提供乙個鍵值對容器,map與multimap差別僅僅在於multiple允許乙個鍵對應多個值.一.map的說明 1.標頭檔案 include 2.定義方法 1 mapm 2 typedef mapm m m 3.插入資料 1 m a 1 2 m.insert map value ty...