多型的基本介紹
-
多型基礎
- 面向物件新求
- 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/79227.html
標籤:C++
上一篇:c++-繼承的學習
下一篇:c++-多型的練習
