第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么我們需要C+中的虛擬函數(shù)?

為什么我們需要C+中的虛擬函數(shù)?

C++ C
慕妹3146593 2019-06-01 16:30:52
為什么我們需要C+中的虛擬函數(shù)?我正在學(xué)習(xí)C+,我只是進(jìn)入了虛擬函數(shù)。根據(jù)我在書中和網(wǎng)上所讀到的,虛擬函數(shù)是基類中的函數(shù),您可以在派生類中重寫這些函數(shù)。但是在這本書的早些時(shí)候,當(dāng)我學(xué)習(xí)基本繼承時(shí),我可以在派生類中重寫基函數(shù),而不需要使用virtual.我在這里錯(cuò)過(guò)了什么?我知道虛擬函數(shù)還有更多,而且它似乎很重要,所以我想弄清楚它到底是什么。我只是在網(wǎng)上找不到一個(gè)直截了當(dāng)?shù)拇鸢浮?
查看完整描述

3 回答

?
紅顏莎娜

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊

這是我所理解的,而不僅僅是virtual函數(shù)是,但為什么需要它們:

假設(shè)你有這兩門課:

class Animal{
    public:
        void eat() { std::cout << "I'm eating generic food."; }};class Cat : public Animal{
    public:
        void eat() { std::cout << "I'm eating a rat."; }};

在你的主要職能中:

Animal *animal = new Animal;Cat *cat = new Cat;animal->eat(); // Outputs: "I'm eating generic food."cat->eat();    
// Outputs: "I'm eating a rat."

到目前為止還不錯(cuò),對(duì)吧?動(dòng)物吃普通食物,貓吃老鼠,都不吃。virtual.

讓我們現(xiàn)在稍微改變一下,這樣eat()通過(guò)一個(gè)中間函數(shù)(僅在本例中是一個(gè)平凡的函數(shù))調(diào)用:

// This can go at the top of the main.cpp filevoid func(Animal *xyz) { xyz->eat(); }

現(xiàn)在我們的主要職能是:

Animal *animal = new Animal;Cat *cat = new Cat;func(animal); // Outputs: "I'm eating generic food."func(cat);   
 // Outputs: "I'm eating generic food."

呃哦.。我們經(jīng)過(guò)了一只貓func()但它不會(huì)吃老鼠。你應(yīng)該超載嗎func()所以這需要一個(gè)Cat*?如果你不得不從動(dòng)物那里得到更多的動(dòng)物,它們都需要自己的動(dòng)物func().

解決辦法是eat()Animal對(duì)虛擬函數(shù)進(jìn)行分類:

class Animal{
    public:
        virtual void eat() { std::cout << "I'm eating generic food."; }};class Cat : public Animal{
    public:
        void eat() { std::cout << "I'm eating a rat."; }};

主要:

func(animal); // Outputs: "I'm eating generic food."func(cat);    // Outputs: "I'm eating a rat."

完成了。


查看完整回答
反對(duì) 回復(fù) 2019-06-01
?
慕森卡

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊

如果沒(méi)有“虛擬”,您就會(huì)得到“早期綁定”。在編譯時(shí)將根據(jù)調(diào)用的指針的類型來(lái)決定方法的實(shí)現(xiàn)。

與“虛擬”你得到“晚綁定”。在運(yùn)行時(shí),將根據(jù)指向?qū)ο蟮念愋蛠?lái)決定該方法的實(shí)現(xiàn),該對(duì)象最初是作為什么構(gòu)造的。根據(jù)指向該對(duì)象的指針的類型,這不一定是您所想的。

class Base{
  public:
            void Method1 ()  {  std::cout << "Base::Method1" << std::endl;  }
    virtual void Method2 ()  {  std::cout << "Base::Method2" << std::endl;  }};class Derived : public Base{
  public:
    void Method1 ()  {  std::cout << "Derived::Method1" << std::endl;  }
    void Method2 ()  {  std::cout << "Derived::Method2" << std::endl;  }};Base* obj = new Derived ();
  //  Note - constructed as Derived, but pointer stored as Base*obj->Method1 ();  //  Prints "Base::Method1"obj->Method2 (); 
   //  Prints "Derived::Method2"

編輯-見這個(gè)問(wèn)題.

也-本教程涵蓋早期和后期的C+綁定。



查看完整回答
反對(duì) 回復(fù) 2019-06-01
  • 3 回答
  • 0 關(guān)注
  • 637 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)