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

C++繼承詳細(xì)介紹

 更新時(shí)間:2022年10月18日 14:49:21   作者:是星星鴨  
我們都知道面向?qū)ο笳Z(yǔ)言的三大特點(diǎn)是:**封裝,繼承,多態(tài)。**之前在類(lèi)和對(duì)象部分,我們提到了C++中的封裝,那么今天呢,我們來(lái)學(xué)習(xí)一下C++中的繼承

前言

可能會(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ù)字雨效果

    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)示例

    這篇文章主要為大家介紹了C++編程如何使用findfirst和findnext查找及遍歷文件實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • 使用C++模擬實(shí)現(xiàn)2024春晚劉謙魔術(shù)

    使用C++模擬實(shí)現(xiàn)2024春晚劉謙魔術(shù)

    劉謙在2024年春晚上的撕牌魔術(shù)的數(shù)學(xué)原理非常簡(jiǎn)單,所以這篇文章主要為大家詳細(xì)介紹了如何使用C++模擬實(shí)現(xiàn)這一魔術(shù)效果,感興趣的可以了解下
    2024-02-02
  • C++直接cout指針名的含義?

    C++直接cout指針名的含義?

    今天小編就為大家分享一篇關(guān)于C++直接cout指針名的含義?,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例

    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ì)示例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)成績(jī)統(tǒng)計(jì)示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++拷貝構(gòu)造函數(shù)中的陷阱

    C++拷貝構(gòu)造函數(shù)中的陷阱

    這篇文章主要介紹了C++拷貝構(gòu)造函數(shù)中的陷阱,拷貝構(gòu)造函數(shù)大家都比較熟悉,通俗講就是傳入一個(gè)對(duì)象,拷貝一份副本。不過(guò)看似簡(jiǎn)單的東西,實(shí)際不注意的話(huà)就會(huì)產(chǎn)生問(wèn)題,下面我們就來(lái)看看C++拷貝構(gòu)造函數(shù)中都有哪些陷阱吧
    2022-01-01
  • C語(yǔ)言 從根本上理解數(shù)組

    C語(yǔ)言 從根本上理解數(shù)組

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類(lèi)型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類(lèi)型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素
    2022-04-04
  • C語(yǔ)言超詳細(xì)講解函數(shù)指針的運(yùn)用

    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í)例

    這篇文章主要介紹了 C++ 使用模板實(shí)現(xiàn)一個(gè)List的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評(píng)論

神池县| 南皮县| 沈阳市| 清水县| 巩义市| 丹凤县| 晋中市| 正镶白旗| 莱芜市| 武汉市| 周口市| 仪征市| 富阳市| 资溪县| 金门县| 囊谦县| 巴彦淖尔市| 明溪县| 荣昌县| 邳州市| 扶沟县| 亚东县| 阿尔山市| 湘西| 延吉市| 浠水县| 宁陕县| 彭水| 司法| 上栗县| 梓潼县| 浏阳市| 个旧市| 鄂托克旗| 青阳县| 道孚县| 莱阳市| 浠水县| 德庆县| 滦南县| 钟祥市|