最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++繼承的定義與注意事項

 更新時間:2021年05月11日 09:48:04   作者:程序字母K  
這篇文章主要給大家介紹了關于C++繼承的定義與注意事項的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、什么是繼承?

1.1、概念

**繼承(inheritance)機制是面向對象程序設計使代碼可以復用的最重要的手段,它允許程序員在保持原有類特性的基礎上進行擴展,增加功能,這樣產(chǎn)生新的類,稱派生類。

1.2、定義

下面我們看到Person是父類,也稱作基類。Student是子類,也稱作派生類

1.2.1、繼承關系和訪問限定符

1.2.2、繼承基類成員訪問方式的變化

// 實例演示三種繼承關系下基類成員的各類型成員訪問關系的變化
class Person
{
public :
void Print ()
{
cout<<_name <<endl;
}
protected :
string _name ; // 姓名
private :
int _age ; // 年齡
};
//三種繼承方式,對應上面圖表
//class Student : protected Person
//class Student : private Person
class Student : public Person
{
protected :
int _stunum ; // 學號
};

注意:

1.基類private成員在派生類中無論以什么方式繼承都是不可見的。不可見是指基類的私有成員還是被繼承到了派生類對象中,但是語法上派生類對像無法訪問;

2.使用關鍵字class時默認的繼承方式是private,使用struct時默認的繼承方式是public,不過最好顯示的寫出繼承方式;

3. 在實際運用中一般使用都是public繼承,不提倡使protetced/private繼承,因為protetced/private繼承下來的成員都只能在派生類的類里面使用,實際中擴展維護性不強;

二、基類和派生類對象賦值轉換

派生類(子類)對象可以賦值給基類(父類)對象/指針/引用;

即將父類中那部分賦值給基類;

這里有個形象的說法叫切片或者切割。寓意把派生類中父類那部分切來賦值過去。

基類對象不能賦值給派生類對象;

基類的指針可以通過強制類型轉換賦值給派生類的指針。但是必須是基類的指針是指向派生類對象時才是安全的。這里基類如果是多態(tài)類型,可以使用RTTI(Run-Time Type Information)的dynamic_cast 來進行識別后進行安全轉換;

Student sobj ;
// 1.子類對象可以賦值給父類對象/指針/引用
Person pobj = sobj ;
Person* pp = &sobj;
Person& rp = sobj;
//2.基類對象不能賦值給派生類對象
sobj = pobj;//錯誤
// 3.基類的指針可以通過強制類型轉換賦值給派生類的指針
pp = &sobj
Student* ps1 = (Student*)pp; // 這種情況轉換時可以的。
ps1->_No = 10;
pp = &pobj;
Student* ps2 = (Student*)pp; // 這種情況轉換時雖然可以,但是會存在越界訪問的問題
ps2->_No = 10;

三、繼承中的作用域

  1. 在繼承體系中基類和派生類都有獨立的作用域。
  2. 子類和父類中有同名成員,子類成員將屏蔽父類對同名成員的直接訪問,這種情況叫隱藏,也叫重定
  3. 義。(在子類成員函數(shù)中,可以使用 基類::基類成員 顯示訪問)
  4. 需要注意的是如果是成員函數(shù)的隱藏,只需要函數(shù)名相同就構成隱藏。
  5. 注意在實際中在繼承體系里面最好不要定義同名的成員。
 // Student的_num和Person的_num構成隱藏關系,可以看出這樣代碼雖然能跑,但是非常容易混淆
class Person
{
protected :
string _name = "小李子"; // 姓名
int _num = 111; // 身份證號
};
class Student : public Person
{
public:
void Print()
{
cout<<" 姓名:"<<_name<< endl;
cout<<" 身份證號:"<<Person::_num<< endl;
cout<<" 學號:"<<_num<<endl;
}
protected:
int _num = 999; // 學號
};
void Test()
{
Student s1;
s1.Print();
};
// B中的fun和A中的fun不是構成重載,因為不是在同一作用域
// B中的fun和A中的fun構成隱藏,成員函數(shù)滿足函數(shù)名相同就構成隱藏。
class A
{
public:
void fun()
{
cout << "func()" << endl;
}
};
class B : public A
{
public:
void fun(int i)

{
A::fun();
cout << "func(int i)->" <<i<<endl;
}
};
void Test()
{
B b;
b.fun(10);
};

四、派生類的默認成員函數(shù)

6個默認成員函數(shù),“默認”的意思就是指我們不寫,編譯器會變我們自動生成一個,那么在派生類中,這幾個
成員函數(shù)是如何生成的呢?

  1. 派生類的構造函數(shù)必須調用基類的構造函數(shù)初始化基類的那一部分成員。如果基類沒有默認的構造函
  2. 數(shù),則必須在派生類構造函數(shù)的初始化列表階段顯示調用。
  3. 派生類的拷貝構造函數(shù)必須調用基類的拷貝構造完成基類的拷貝初始化。
  4. 派生類的operator=必須要調用基類的operator=完成基類的復制。
  5. 派生類的析構函數(shù)會在被調用完成后自動調用基類的析構函數(shù)清理基類成員。因為這樣才能保證派生類
  6. 對象先清理派生類成員再清理基類成員的順序。
  7. 派生類對象初始化先調用基類構造再調派生類構造。
  8. 派生類對象析構清理先調用派生類析構再調基類的析構。


五、繼承與友元

友元關系不能繼承,也就是說基類友元不能訪問子類私有和保護成員;

六、繼承與靜態(tài)成員

基類定義了static靜態(tài)成員,則整個繼承體系里面只有一個這樣的成員;

七、菱形繼承

單繼承:一個子類只有一個直接父類

多繼承:一個子類有兩個或以上直接父類時稱這個繼承關系為多繼承

菱形繼承:菱形繼承是多繼承的一種特殊情況。

菱形繼承的問題:從下面的對象成員模型構造,可以看出菱形繼承有數(shù)據(jù)冗余和二義性的問題。在Assistant的對象中Person成員會有兩份。

虛擬繼承可以解決菱形繼承的二義性和數(shù)據(jù)冗余的問題,在Student和Teacher的繼承;

加關鍵字:virtual

菱形繼承的內存對象成員模型:這里可以看到數(shù)據(jù)冗余

菱形虛擬繼承的內存對象成員模型:這里可以分析出D對象中將A放到的了對象組成的最下面,這個A同時屬于B和C,那么B和C如何去找到公共的A呢?

這里是通過了B和C的兩個指針,指向的一張表。這兩個指針叫虛基表指針,這兩個表叫虛基表。虛基表中存的偏移量。通過偏移量可以找到下面的A。

虛基表:存放偏移量

八、繼承和組合

public繼承是一種is-a的關系。也就是說每個派生類對象都是一個基類對象,高耦合;

組合是一種has-a的關系。假設B組合了A,每個B對象中都有一個A對象,低耦合;

優(yōu)先使用對象組合,而不是類繼承

繼承和耦合的使用:

// Car和BMW Car和Benz構成is-a的關系
class Car{
protected:
string _colour = "白色"; // 顏色
string _num = "陜ABIT00"; // 車牌號
};
class BMW : public Car{
public:
void Drive() {cout << "好開-操控" << endl;}
};
class Benz : public Car{
public:
void Drive() {cout << "好坐-舒適" << endl;}
};
// Tire和Car構成has-a的關系
class Tire{
protected:
string _brand = "Michelin"; // 品牌
size_t _size = 17; // 尺寸
};
class Car{
protected:
string _colour = "白色"; // 顏色
string _num = "陜ABIT00"; // 車牌號
Tire _t; // 輪胎
};

總結

到此這篇關于C++繼承的定義與注意事項的文章就介紹到這了,更多相關C++繼承內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++指針 詳細介紹及總結

    C++指針 詳細介紹及總結

    這篇文章主要介紹了C++指針 詳細介紹及總結的相關資料,需要的朋友可以參考下
    2016-09-09
  • C/C++時間庫chrono的使用總結

    C/C++時間庫chrono的使用總結

    std::chrono是C++標準庫中的一個組件,用于表示和處理時間,其功能就像是心理學中的感知系統(tǒng),它可以為我們捕捉、量化并操作抽象的時間概念,這就如同我們的大腦可以理解和感知周圍環(huán)境的時間流逝一樣,這種感知和理解能力是人類進行日?;顒铀匦璧?
    2023-12-12
  • c++將引用或者是指針作為函數(shù)參數(shù)實現(xiàn)實參的運算

    c++將引用或者是指針作為函數(shù)參數(shù)實現(xiàn)實參的運算

    這篇文章主要介紹了c++將引用或者是指針作為函數(shù)參數(shù)實現(xiàn)實參的運算,需要的朋友可以參考下
    2014-05-05
  • C++?超詳細講解stack與queue的使用

    C++?超詳細講解stack與queue的使用

    C++?Stack(堆棧)?是一個容器類的改編,為程序員提供了堆棧的全部功能,也就是說實現(xiàn)了一個先進后出(FILO)的數(shù)據(jù)結構,許多程序都使用了?queue?容器。queue?容器可以用來表示超市的結賬隊列或服務器上等待執(zhí)行的數(shù)據(jù)庫事務隊列
    2022-03-03
  • C++數(shù)據(jù)結構之list詳解

    C++數(shù)據(jù)結構之list詳解

    list是一種序列式容器。list容器完成的功能實際上和數(shù)據(jù)結構中的雙向鏈表是極其相似的,list中的數(shù)據(jù)元素是通過鏈表指針串連成邏輯意義上的線性表,也就是list也具有鏈表的主要優(yōu)點,即:在鏈表的任一位置進行元素的插入、刪除操作都是快速的
    2021-11-11
  • C語言多媒體框架GStreamer使用教程深講

    C語言多媒體框架GStreamer使用教程深講

    GStreamer 是用來構建流媒體應用的開源多媒體框架(framework),其目標是要簡化音/視頻應用程序的開發(fā),已經(jīng)能夠被用來處理像 MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime 等多種格式的多媒體數(shù)據(jù)
    2022-07-07
  • 利用C語言將點分十進制的IP字符串轉成4個整數(shù)

    利用C語言將點分十進制的IP字符串轉成4個整數(shù)

    這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)將點分十進制的IP字符串轉成4個整數(shù),文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-01-01
  • C語言switch 語句的用法詳解

    C語言switch 語句的用法詳解

    本文主要介紹C 語言中的switch 語句,這里提供示例代碼和詳細介紹,希望能幫助學習C語言的小伙伴
    2016-07-07
  • C++中的String的常用函數(shù)用法

    C++中的String的常用函數(shù)用法

    這篇文章主要介紹了C語言中String的常用函數(shù)用法,對學習String的小伙伴有一定的參考價值,感興趣的小伙伴可以借鑒一下
    2023-03-03
  • Linux?C/C++實現(xiàn)顯示NIC流量統(tǒng)計信息

    Linux?C/C++實現(xiàn)顯示NIC流量統(tǒng)計信息

    NIC流量統(tǒng)計信息是由操作系統(tǒng)維護的,當數(shù)據(jù)包通過NIC傳輸時,操作系統(tǒng)會更新相關的計數(shù)器,通過讀取這些計數(shù)器,我們可以獲得關于網(wǎng)絡流量的信息,下面我們就來學習一下如何通過C/C++實現(xiàn)顯示NIC流量統(tǒng)計信息吧
    2024-01-01

最新評論

衡东县| 钟祥市| 岳普湖县| 南川市| 通渭县| 从江县| 通州市| 大姚县| 江津市| 彩票| 凌源市| 关岭| 旺苍县| 交口县| 那坡县| 泽州县| 丁青县| 高要市| 嘉黎县| 乌拉特中旗| 鹤壁市| 宜川县| 神农架林区| 玉环县| 江阴市| 宁津县| 黑河市| 平和县| 子洲县| 兴山县| 峨眉山市| 平罗县| 延川县| 那曲县| 盐亭县| 湖州市| 门头沟区| 运城市| 开鲁县| 丰镇市| 石屏县|