繼承,是從已經存在的類中獲得屬性,再此基礎之上新增自己屬性的過程。原有的類成為基類或父類,產生的新類則為派生類或子類。
當然也可以從多個基類中進行派生,此時叫多重繼承。從乙個基類中進行派生,稱為單繼承。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 和 job,其中 person 派生出 student,student 和 job 派生出 postgraduate,在 student 中還存在乙個 club 的成員,從上邊的結果可以看出: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()
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()
上邊的例子中,student 類繼承了 person 和 club 類,兩個類中都含有 sidplay 函式,因此在這種問題中如果想要呼叫某個類中的該函式時,需要加上作用域運算子進行限定。the person name is zhangsan.
the person *** is x.
the club name is math.
the student num is 100.
上邊的例子中說明的是上圖左邊的情況,此種情況下,派生類的基類之間沒有發生過交叉。但是如果是右圖中的繼承關係,就有點不太一樣了,此時 b 中含有 a 的成員,c 中也含有 a 的成員,d 同時含有 b 和 c 的成員,也就說含有 a 的兩份成員,這樣的情況是需要避免的。
需要在交叉點處(上例為 d)為虛基類構建引數初始化列表。#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():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...