欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年10月18日 14:49:21   作者:是星星鴨  
我們都知道面向?qū)ο笳Z(yǔ)言的三大特點(diǎn)是:**封裝,繼承,多態(tà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            // 父類(基類)
{
	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)存的分配最全面分析

    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-08
  • C++利用鏈棧實(shí)現(xiàn)表達(dá)式求值

    C++利用鏈棧實(shí)現(xiàn)表達(dá)式求值

    這篇文章主要為大家詳細(xì)介紹了C++利用鏈棧實(shí)現(xiàn)表達(dá)式求值的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-05-05
  • C++實(shí)現(xiàn)LeetCode(90.子集合之二)

    C++實(shí)現(xiàn)LeetCode(90.子集合之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(90.子集合之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作

    C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作

    這篇文章主要介紹了C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法

    c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法

    在本篇文章里小編給大家整理的是關(guān)于c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法,有需要的朋友們可以參考下。
    2020-02-02
  • C語(yǔ)言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼

    C語(yǔ)言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼

    這篇文章主要介紹了C語(yǔ)言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼,大家參考使用吧
    2013-11-11
  • C++ 系統(tǒng)String類詳解

    C++ 系統(tǒng)String類詳解

    這篇文章主要介紹了C++的系統(tǒng)String類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • 初學(xué)C++之自定義類型名簡(jiǎn)化詳解

    初學(xué)C++之自定義類型名簡(jiǎn)化詳解

    下面小編就為就大家?guī)?lái)一篇初學(xué)C++之自定義類型名簡(jiǎn)化詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • C/C++中獲取數(shù)組長(zhǎng)度的方法示例

    C/C++中獲取數(shù)組長(zhǎng)度的方法示例

    這篇文章主要介紹了C/C++中獲取數(shù)組長(zhǎng)度的方法,很實(shí)用的一種方法,需要的朋友可以參考下
    2014-08-08
  • C語(yǔ)言每日練習(xí)之冒泡排序

    C語(yǔ)言每日練習(xí)之冒泡排序

    這篇文章主要介紹了C語(yǔ)言冒泡排序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11

最新評(píng)論