C++繼承詳細(xì)介紹
前言
可能會(huì)涉及到匯編的知識(shí),不過這沒有關(guān)系,肯定能看懂,看不懂留言,我再做解釋。
使用到的工具是vs2010。
本節(jié)只講繼承的特點(diǎn),公有私有多態(tài)等內(nèi)容暫且不講,以后會(huì)細(xì)說。
一、什么是繼承
繼承就是數(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,這足以說明slave是拷貝了一份a和b給slave子類的。
查看匯編:

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

子類調(diào)用了子類的。
父類的對象會(huì)調(diào)用誰的呢?
測試如下:

運(yùn)行:

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

從這張圖我們可以得知,子類包含了父類中允許繼承的所有內(nèi)容;但父類不包含任何子類的東西。
所以,子類可以直接調(diào)用父類是應(yīng)該的,如下:
#include <stdio.h>
#include <Windows.h>
struct Master
{
void test()
{
printf("這是父類的測試。\n");
}
};
struct Slave:Master
{
void test()
{
printf("這是子類的測試。\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)用的話是不被允許的。
不過可以通過其他方法進(jìn)行調(diào)用;
父類調(diào)用子類
我們知道,純虛函數(shù)是必須要子類進(jìn)行實(shí)現(xiàn)的,如果父類定義了純虛函數(shù),子類不進(jìn)行實(shí)現(xiàn),就會(huì)報(bào)錯(cuò);我們可以通過這一點(diǎn),讓父類定義純虛函數(shù),子類來實(shí)現(xiàn)這個(gè)純虛函數(shù);然后父類定義指針(純虛類就是接口類,無法定義對象,可以定義指針)來指向子類,調(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("這是子類的測試。\n");
}
};
int main()
{
Slave slave;
slave.test(); // 子類正常調(diào)用
// Master master; // 不可以定義對象,會(huì)出錯(cuò)。
Master *master = &slave; // 可以定義指針指向子類
master->test();
system("pause");
return 0;
}運(yùn)行:

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

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

論證成功。
四、多重繼承
就是說子類不單單可以繼承一個(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言動(dòng)態(tài)內(nèi)存的分配最全面分析
動(dòng)態(tài)內(nèi)存是相對靜態(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語言中動(dòng)態(tài)內(nèi)存的管理2022-08-08
C++實(shí)現(xiàn)LeetCode(90.子集合之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(90.子集合之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作
這篇文章主要介紹了C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法,有需要的朋友們可以參考下。2020-02-02
C語言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼
這篇文章主要介紹了C語言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼,大家參考使用吧2013-11-11

