C++繼承詳細(xì)介紹
前言
可能會(huì)涉及到匯編的知識(shí),不過(guò)這沒(méi)有關(guān)系,肯定能看懂,看不懂留言,我再做解釋。
使用到的工具是vs2010。
本節(jié)只講繼承的特點(diǎn),公有私有多態(tài)等內(nèi)容暫且不講,以后會(huì)細(xì)說(shuō)。
一、什么是繼承
繼承就是數(shù)據(jù)的復(fù)制
概念模糊、直接上代碼:
#include <stdio.h> #include <Windows.h> struct Master // 父類(基類) { int a; int b; }; struct Slave:Master // 子類(派生類) { int c; int d; }; int main() { Slave slave; slave.a = 1; slave.b = 2; slave.c = 3; slave.d = 4; int x = sizeof(slave); system("pause"); // 此處下斷點(diǎn)查看x的大小(子類的大?。? return 0; }
運(yùn)行,查看x的值:
16,這足以說(shuō)明slave是拷貝了一份a和b給slave子類的。
查看匯編:
可以看出繼承就是數(shù)據(jù)的復(fù)制
二、派生類和基類的成員重復(fù)問(wèn)題
1、派生類和基類的成員可以重復(fù)嗎?
2、重復(fù)的話是使用的哪一個(gè)類的成員呢?
解答如下:
1、派生類和基類的成員可以重復(fù)嗎?
可以。
證明:
#include <stdio.h> #include <Windows.h> struct Master { int a; int b; }; struct Slave:Master { int a; int d; }; int main() { Slave slave; printf("%d \n",sizeof(slave)); system("pause"); return 0; }
運(yùn)行:
不僅可以,而且slave類的大小依舊是16字節(jié);
這說(shuō)明了子類的a和父類的a是分開(kāi)的,父類的a依舊被拷貝到了子類,盡管子類已經(jīng)有成員a;
2、重復(fù)的話是使用的哪一個(gè)類的成員呢?
這樣就不要使用變量來(lái)測(cè)試了,因?yàn)樽兞繜o(wú)法輸出內(nèi)容,很難分辨出是父類還是子類的,所以我們使用函數(shù)。
如下:
#include <stdio.h> #include <Windows.h> struct Master { void test() { printf("這是父類的測(cè)試。\n"); } }; struct Slave:Master { void test() { printf("這是子類的測(cè)試。\n"); } }; int main() { Slave slave; slave.test(); system("pause"); return 0; }
定義一父一子,類中都定義了test函數(shù),那么子類的對(duì)象會(huì)調(diào)用誰(shuí)的呢?
運(yùn)行如下:
子類調(diào)用了子類的。
父類的對(duì)象會(huì)調(diào)用誰(shuí)的呢?
測(cè)試如下:
運(yùn)行:
父類調(diào)用父類。
可以看到,對(duì)象的默認(rèn)調(diào)用都是本類自己定義的函數(shù)。
父類調(diào)用子類方法
父類可以調(diào)用子類方法嗎?如何調(diào)用?子類又如何調(diào)用父類呢?
父類可以調(diào)用子類方法,步過(guò)需要一些手段;子類可以直接調(diào)用父類
先看一張圖:
從這張圖我們可以得知,子類包含了父類中允許繼承的所有內(nèi)容;但父類不包含任何子類的東西。
所以,子類可以直接調(diào)用父類是應(yīng)該的,如下:
#include <stdio.h> #include <Windows.h> struct Master { void test() { printf("這是父類的測(cè)試。\n"); } }; struct Slave:Master { void test() { printf("這是子類的測(cè)試。\n"); } }; int main() { Slave slave; slave.test(); slave.Master::test(); // 聲明調(diào)用父類的內(nèi)容即可 system("pause"); return 0; }
運(yùn)行如下:
可以看到,子類正常的調(diào)用了父類的方法;
如果父類直接調(diào)用子類的呢?
如下:
直接調(diào)用的話是不被允許的。
不過(guò)可以通過(guò)其他方法進(jìn)行調(diào)用;
父類調(diào)用子類
我們知道,純虛函數(shù)是必須要子類進(jìn)行實(shí)現(xiàn)的,如果父類定義了純虛函數(shù),子類不進(jìn)行實(shí)現(xiàn),就會(huì)報(bào)錯(cuò);我們可以通過(guò)這一點(diǎn),讓父類定義純虛函數(shù),子類來(lái)實(shí)現(xiàn)這個(gè)純虛函數(shù);然后父類定義指針(純虛類就是接口類,無(wú)法定義對(duì)象,可以定義指針)來(lái)指向子類,調(diào)用子類的函數(shù)。
如下:
#include <stdio.h> #include <Windows.h> struct Master { virtual void test() = 0; // 父類定義純虛函數(shù) }; struct Slave:Master { void test() // 子類實(shí)現(xiàn)純虛函數(shù) { printf("這是子類的測(cè)試。\n"); } }; int main() { Slave slave; slave.test(); // 子類正常調(diào)用 // Master master; // 不可以定義對(duì)象,會(huì)出錯(cuò)。 Master *master = &slave; // 可以定義指針指向子類 master->test(); system("pause"); return 0; }
運(yùn)行:
成功調(diào)用。
當(dāng)然還有其他方法可以讓父類調(diào)用子類,不過(guò)本文章只講繼承,不深入其他內(nèi)容;大家感興趣的話可以自己百度看看。
三、繼承不僅僅局限于父類
怎么理解這個(gè)標(biāo)題呢?就是說(shuō),不單單是父類可以有派生類,子類也可以有派生類。
如果子類有派生類,那么子類的派生類僅僅有父類的成員,還是既有父類的成員也有父類的父類成員?
觀點(diǎn):子類的派生類,即會(huì)擁有父類的公有成員也會(huì)擁有父類的父類的公有成員。
文字模糊,看圖:
通過(guò)這張圖我們可以知道:Son調(diào)用Slave的函數(shù)或者M(jìn)aster的函數(shù)可以直接調(diào)用;
Son包含Master和Slave所有公有成員、Slave只包含Master的公有成員、Master只包含自己的成員。
論證如下:
直接測(cè)試類所占用字節(jié)數(shù)就行了,如下:
#include <stdio.h> #include <Windows.h> struct Master { int a; int b; }; struct Slave:Master { int c; int d; }; struct Son:Slave { int e; int f; }; int main() { int MasterSize = sizeof(struct Master); int SlaveSize = sizeof(struct Slave); int SonSize = sizeof(struct Son); printf("Master成員個(gè)數(shù):\t%d\nSlave成員個(gè)數(shù):\t\t%d\nSon成員個(gè)數(shù):\t\t%d\n",MasterSize/4,SlaveSize/4,SonSize/4); system("pause"); return 0; }
Slave繼承Master,Son繼承Slave
三個(gè)類的成員都是int類型,所以通過(guò)類的字節(jié)數(shù)/4就可以知道這個(gè)類有幾個(gè)成員
運(yùn)行如下:
論證成功。
四、多重繼承
就是說(shuō)子類不單單可以繼承一個(gè)父類,可以繼承多個(gè)。
如下:
#include <stdio.h> #include <Windows.h> struct Master // 第一個(gè)父類 { int a; int b; }; struct Slave // 第二個(gè)父類 { int c; int d; }; struct Son:Slave,Master // 兩個(gè)父類 { int e; int f; }; int main() { int MasterSize = sizeof(struct Master); int SlaveSize = sizeof(struct Slave); int SonSize = sizeof(struct Son); printf("Master成員個(gè)數(shù):\t%d\nSlave成員個(gè)數(shù):\t\t%d\nSon成員個(gè)數(shù):\t\t%d\n",MasterSize/4,SlaveSize/4,SonSize/4); system("pause"); return 0; }
運(yùn)行如下:
所以,如圖:
這就是多重繼承,但是多重繼承增加了程序的復(fù)雜度,不建議使用 。
總結(jié)
1、什么是繼承?
繼承就是數(shù)據(jù)的復(fù)制
2、為什么要繼承?
減少重復(fù)代碼的編寫
3、繼承不僅僅局限于父類
4、多重繼承增加了程序的復(fù)雜度,不建議使用
5、父類基類都是同一個(gè)東西,子類派生類都是同一個(gè)東西
到此這篇關(guān)于C++繼承詳細(xì)介紹的文章就介紹到這了,更多相關(guān)C++繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言動(dòng)態(tài)內(nèi)存的分配最全面分析
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語(yǔ)言中動(dòng)態(tài)內(nèi)存的管理2022-08-08C++實(shí)現(xiàn)LeetCode(90.子集合之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(90.子集合之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作
這篇文章主要介紹了C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法,有需要的朋友們可以參考下。2020-02-02C語(yǔ)言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼
這篇文章主要介紹了C語(yǔ)言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼,大家參考使用吧2013-11-11