多態的基本介紹
- 多態基礎
- 面向對象新求
- C++編譯器提供的多態解決方案
- 多態意義、多態成立的是三個條件
- 多態理論基礎
- 多態面試題強化
- 多態的理解
- C++編譯器如何實現多態
- 重載重寫重定義
- 虛析構函數
- 能否爲每一個類的普通成員函數定義爲虛函數
- 構造函數中調用虛函數,能實現多態嗎?
- 虛函數表指針vptr指針分步初始化
- 父類指針和子類指針步長不同 和 父類指針指向子類對象 兩個不一樣的概念
- 多態原理探究
- 總結記憶1:C++編譯器提早佈局,在類對象中增長vptr指針、虛函數入口地址存虛函數表
- 總結記憶2: C++編譯器並非區分子類對象和父類對象,而是根據對象指針、找vptr指針,再找虛函數入口,實現遲綁定,支持了多態
- 多態發生的三個必要條件:
- 要有繼承。
- 要有虛函數重寫。
- 父類指針或引用 指向 子類對象。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
//嶽不羣
class Yuebuqun
{
public:
Yuebuqun( string kongfu)
{
this->kongfu = kongfu;
}
virtual void fight() //標識修飾一個成員方法是一個虛函數。
{
cout << "嶽不羣" << "使出了" << kongfu << "打人" << endl;
}
void print()
{
}
string kongfu;
};
//林平之 繼承了 嶽不羣
class Linpingzhi :public Yuebuqun
{
public:
Linpingzhi(string kongfu) :Yuebuqun(kongfu)
{
}
//若是說父類中有一個虛函數是fight( ), 子類若是去重寫這個虛函數。
void fight()
{
cout << "林平之" << "使出了" << kongfu << "打人" << endl;
}
void print()
{
}
};
class Linghuchong :public Yuebuqun
{
public:
Linghuchong(string kongfu) :Yuebuqun(kongfu)
{
}
void fight()
{
cout << "令狐沖 " << "使用了" << kongfu << endl;
}
};
//在全局提供一個打鬥的方法
void fightPeople(Yuebuqun *hero)//Yuebuqun *hero = xiaopp; Yuebuqun *hero = xiaoyy;
{
cout << "調用打人的方法" << endl;
hero->fight();//但願傳遞進來的若是是子類,調用子類的fight
//若是傳遞進來的是父類, 調用父類的fight
//這種行爲就是 多態行爲。
}
int main(void)
{
Yuebuqun *xiaoyy = new Yuebuqun("葵花寶典");
//xiaoyy->fight();
Linpingzhi *xiaopp = new Linpingzhi("僻邪劍譜");
//xiaopp->fight();
Linghuchong *xiaoll = new Linghuchong("獨孤九劍");
fightPeople(xiaoyy);
fightPeople(xiaopp);
fightPeople(xiaoll);
//編譯器默認作了一個安全的處理。 編譯認爲 無論傳遞時子類對象仍是父類對象,
//若是統一執行父類d方法 那麼是必定能夠被成功執行。
delete xiaoyy;
delete xiaopp;
delete xiaoll;
return 0;
}
多態案例及其意義
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//英雄類
//1999
class Hero
{
public:
virtual int getAd() {
return 10;
}
};
//1999
class AdvHero :public Hero
{
public:
virtual int getAd()
{
return 1001;
}
};
//怪獸類
//1999
class Monster
{
public:
int getAd() {
return 1000;
}
};
//戰鬥方法
//1999 //寫的架構函數,能夠調用將來。
void playerFight(Hero *hp, Monster *mp)
{
//多態對於編譯器來說的,也是一個動態聯編,也是一個遲邦定。
if (hp->getAd() > mp->getAd()) { //hp->getAd 發生了多態
cout << "英雄勝利, 怪獸被打死" << endl;
}
else {
cout << "英雄掛了,怪獸贏了" << endl;
}
}
//2020年
class BugHero :public Hero
{
public:
virtual int getAd()
{
cout << "調用了bugHero的方法" << endl;
return 66666;
}
};
int main(void)
{
Hero h;
Monster m;
playerFight(&h, &m);
AdvHero advH;
playerFight(&advH, &m);
BugHero bH;
playerFight(&bH, &m);
int a = 10;
int b = 20;
cout << a << endl;
if (a > 10) { //遲邦定
cout << "a>10" << endl;
}
else {
cout << "a < 10" << endl;
}
return 0;
}