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 // 父類(lèi)(基類(lèi))
{
int a;
int b;
};
struct Slave:Master // 子類(lèi)(派生類(lèi))
{
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的大?。ㄗ宇?lèi)的大?。?
return 0;
}運(yùn)行,查看x的值:

16,這足以說(shuō)明slave是拷貝了一份a和b給slave子類(lèi)的。
查看匯編:

可以看出繼承就是數(shù)據(jù)的復(fù)制
二、派生類(lèi)和基類(lèi)的成員重復(fù)問(wèn)題
1、派生類(lèi)和基類(lèi)的成員可以重復(fù)嗎?
2、重復(fù)的話(huà)是使用的哪一個(gè)類(lèi)的成員呢?
解答如下:
1、派生類(lèi)和基類(lèi)的成員可以重復(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類(lèi)的大小依舊是16字節(jié);
這說(shuō)明了子類(lèi)的a和父類(lèi)的a是分開(kāi)的,父類(lèi)的a依舊被拷貝到了子類(lèi),盡管子類(lèi)已經(jīng)有成員a;
2、重復(fù)的話(huà)是使用的哪一個(gè)類(lèi)的成員呢?
這樣就不要使用變量來(lái)測(cè)試了,因?yàn)樽兞繜o(wú)法輸出內(nèi)容,很難分辨出是父類(lèi)還是子類(lèi)的,所以我們使用函數(shù)。
如下:
#include <stdio.h>
#include <Windows.h>
struct Master
{
void test()
{
printf("這是父類(lèi)的測(cè)試。\n");
}
};
struct Slave:Master
{
void test()
{
printf("這是子類(lèi)的測(cè)試。\n");
}
};
int main()
{
Slave slave;
slave.test();
system("pause");
return 0;
}定義一父一子,類(lèi)中都定義了test函數(shù),那么子類(lèi)的對(duì)象會(huì)調(diào)用誰(shuí)的呢?
運(yùn)行如下:

子類(lèi)調(diào)用了子類(lèi)的。
父類(lèi)的對(duì)象會(huì)調(diào)用誰(shuí)的呢?
測(cè)試如下:

運(yùn)行:

父類(lèi)調(diào)用父類(lèi)。
可以看到,對(duì)象的默認(rèn)調(diào)用都是本類(lèi)自己定義的函數(shù)。
父類(lèi)調(diào)用子類(lèi)方法
父類(lèi)可以調(diào)用子類(lèi)方法嗎?如何調(diào)用?子類(lèi)又如何調(diào)用父類(lèi)呢?
父類(lèi)可以調(diào)用子類(lèi)方法,步過(guò)需要一些手段;子類(lèi)可以直接調(diào)用父類(lèi)
先看一張圖:

從這張圖我們可以得知,子類(lèi)包含了父類(lèi)中允許繼承的所有內(nèi)容;但父類(lèi)不包含任何子類(lèi)的東西。
所以,子類(lèi)可以直接調(diào)用父類(lèi)是應(yīng)該的,如下:
#include <stdio.h>
#include <Windows.h>
struct Master
{
void test()
{
printf("這是父類(lèi)的測(cè)試。\n");
}
};
struct Slave:Master
{
void test()
{
printf("這是子類(lèi)的測(cè)試。\n");
}
};
int main()
{
Slave slave;
slave.test();
slave.Master::test(); // 聲明調(diào)用父類(lèi)的內(nèi)容即可
system("pause");
return 0;
}運(yùn)行如下:

可以看到,子類(lèi)正常的調(diào)用了父類(lèi)的方法;
如果父類(lèi)直接調(diào)用子類(lèi)的呢?
如下:

直接調(diào)用的話(huà)是不被允許的。
不過(guò)可以通過(guò)其他方法進(jìn)行調(diào)用;
父類(lèi)調(diào)用子類(lèi)
我們知道,純虛函數(shù)是必須要子類(lèi)進(jìn)行實(shí)現(xiàn)的,如果父類(lèi)定義了純虛函數(shù),子類(lèi)不進(jìn)行實(shí)現(xiàn),就會(huì)報(bào)錯(cuò);我們可以通過(guò)這一點(diǎn),讓父類(lèi)定義純虛函數(shù),子類(lèi)來(lái)實(shí)現(xiàn)這個(gè)純虛函數(shù);然后父類(lèi)定義指針(純虛類(lèi)就是接口類(lèi),無(wú)法定義對(duì)象,可以定義指針)來(lái)指向子類(lèi),調(diào)用子類(lèi)的函數(shù)。
如下:
#include <stdio.h>
#include <Windows.h>
struct Master
{
virtual void test() = 0; // 父類(lèi)定義純虛函數(shù)
};
struct Slave:Master
{
void test() // 子類(lèi)實(shí)現(xiàn)純虛函數(shù)
{
printf("這是子類(lèi)的測(cè)試。\n");
}
};
int main()
{
Slave slave;
slave.test(); // 子類(lèi)正常調(diào)用
// Master master; // 不可以定義對(duì)象,會(huì)出錯(cuò)。
Master *master = &slave; // 可以定義指針指向子類(lèi)
master->test();
system("pause");
return 0;
}運(yùn)行:

成功調(diào)用。
當(dāng)然還有其他方法可以讓父類(lèi)調(diào)用子類(lèi),不過(guò)本文章只講繼承,不深入其他內(nèi)容;大家感興趣的話(huà)可以自己百度看看。
三、繼承不僅僅局限于父類(lèi)
怎么理解這個(gè)標(biāo)題呢?就是說(shuō),不單單是父類(lèi)可以有派生類(lèi),子類(lèi)也可以有派生類(lèi)。
如果子類(lèi)有派生類(lèi),那么子類(lèi)的派生類(lèi)僅僅有父類(lèi)的成員,還是既有父類(lèi)的成員也有父類(lèi)的父類(lèi)成員?
觀點(diǎn):子類(lèi)的派生類(lèi),即會(huì)擁有父類(lèi)的公有成員也會(huì)擁有父類(lèi)的父類(lèi)的公有成員。
文字模糊,看圖:

通過(guò)這張圖我們可以知道:Son調(diào)用Slave的函數(shù)或者M(jìn)aster的函數(shù)可以直接調(diào)用;
Son包含Master和Slave所有公有成員、Slave只包含Master的公有成員、Master只包含自己的成員。
論證如下:
直接測(cè)試類(lèi)所占用字節(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è)類(lèi)的成員都是int類(lèi)型,所以通過(guò)類(lèi)的字節(jié)數(shù)/4就可以知道這個(gè)類(lèi)有幾個(gè)成員
運(yùn)行如下:

論證成功。
四、多重繼承
就是說(shuō)子類(lèi)不單單可以繼承一個(gè)父類(lèi),可以繼承多個(gè)。
如下:
#include <stdio.h>
#include <Windows.h>
struct Master // 第一個(gè)父類(lèi)
{
int a;
int b;
};
struct Slave // 第二個(gè)父類(lèi)
{
int c;
int d;
};
struct Son:Slave,Master // 兩個(gè)父類(lèi)
{
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ù)代碼的編寫(xiě)
3、繼承不僅僅局限于父類(lèi)
4、多重繼承增加了程序的復(fù)雜度,不建議使用
5、父類(lèi)基類(lèi)都是同一個(gè)東西,子類(lèi)派生類(lèi)都是同一個(gè)東西
到此這篇關(guān)于C++繼承詳細(xì)介紹的文章就介紹到這了,更多相關(guān)C++繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言+EasyX實(shí)現(xiàn)數(shù)字雨效果
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言+EasyX實(shí)現(xiàn)數(shù)字雨效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
C++編程使用findfirst和findnext查找及遍歷文件實(shí)現(xiàn)示例
這篇文章主要為大家介紹了C++編程如何使用findfirst和findnext查找及遍歷文件實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
使用C++模擬實(shí)現(xiàn)2024春晚劉謙魔術(shù)
劉謙在2024年春晚上的撕牌魔術(shù)的數(shù)學(xué)原理非常簡(jiǎn)單,所以這篇文章主要為大家詳細(xì)介紹了如何使用C++模擬實(shí)現(xiàn)這一魔術(shù)效果,感興趣的可以了解下2024-02-02
C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例
這篇文章主要介紹了C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這樣的知識(shí),需要的朋友可以參考下2017-10-10
C語(yǔ)言實(shí)現(xiàn)成績(jī)統(tǒng)計(jì)示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)成績(jī)統(tǒng)計(jì)示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C語(yǔ)言超詳細(xì)講解函數(shù)指針的運(yùn)用
函數(shù)指針是一個(gè)指針變量,它可以存儲(chǔ)函數(shù)的地址,然后使用函數(shù)指針,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之函數(shù)指針的相關(guān)資料,需要的朋友可以參考下2022-06-06
C++ 使用模板實(shí)現(xiàn)一個(gè)List的實(shí)例
這篇文章主要介紹了 C++ 使用模板實(shí)現(xiàn)一個(gè)List的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05

