C++11基礎知識,基類指針,派生類指針,虛函數,純虛函數

0、用到的類的聲明定義:

human.h,huamn.cpp,man.h,man.cpp,woman.h,woman.cpp類在:
C++基礎知識,C++11中的多態和重載,函數遮蔽,using多態的引入
其他類:
abstractFather.h

#ifndef __ABSTRACTFATHER__
#define __ABSTRACTFATHER__
class abstractFather
{
public:
	abstractFather();
	virtual ~abstractFather();
	virtual void eat() = 0;
};
#endif // !

abstractFather.cpp

#include "abstractFather.h"
#include<iostream>
abstractFather::abstractFather()
{
	std::cout << "abstractFather::abstractFather()" << std::endl;
}
abstractFather::~abstractFather()
{
	std::cout << "abstractFather::~abstractFather()" << std::endl;
}

son.h

#ifndef __SON__
#define __SON__
#include"abstractFather.h"
class son :public abstractFather
{
public:
	son();
	~son();
	virtual void eat();
};
#endif // !son

son.cpp

#include "son.h"
#include<iostream>
son::son()
{
	std::cout << "son::son()" << std::endl;
}
son::~son()
{
	std::cout << "son::~son()" << std::endl;
}
void son::eat()
{
	std::cout << "void son::eat()" << std::endl;
}

1、基類指針,子類指針

基類/父類指針可以new一個子類對象
但是不能使用子類的成員函數,那麼這樣有什麼用處呢?

2、虛函數

這樣就可以聲明一個基類的指針,調用父類的函數,覆蓋,再調用任意子類的函數

	Huamn* human = new Man;
	human->eat();
	delete human;

	human = new Huamn;
	human->eat();
	delete human;

	human = new Woman;
	human->eat();
	delete human;

在這裏插入圖片描述
在子類中,virtual可加可不加,上最好也加上virtual,別人看代碼時比較友好

  • override,爲了避免在子類中寫錯虛函數,就要在子類聲明中,虛函數的末尾加上override編譯器回去找父類中的同名虛函數,如果寫錯了,編譯器會糾錯
  • final也是虛函數專用,但是在基類中的virtual函數末尾加上final,子類就不能重寫override
  • 調用虛函數是動態執行的,只有在程序運行的時候才知道,必須要寫定義部分(內容)

3、純虛函數

在virtual函數末尾加上 = 0,
一旦一個類中有了純虛函數,就不能實例化了,這個類就叫做抽象類了。

  • 1、抽象類不能用來生成對象,主要用來管理子類對象
  • 2、子類必須實現純虛函數

4、基類的析構函數,一定要是虛函數

因爲 父類指針指向new 子類時delete不會調用子類的析構函數,但是如果基類中析構聲明成了虛函數
則會默認調用子類析構函數

虛函數會增加內存開銷,給類增加虛函數表,虛函數指針

	abstractFather* pf = new son;
	delete pf;

執行結果
在這裏插入圖片描述

發佈了157 篇原創文章 · 獲贊 167 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章