c++-多態的學習

多態的基本介紹

  • 多態基礎
    • 面向對象新求
    • 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;
}
相關文章
相關標籤/搜索