亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

C++ C
慕妹3146593 2019-06-01 16:30:52
為什么我們需要C+中的虛擬函數?我正在學習C+,我只是進入了虛擬函數。根據我在書中和網上所讀到的,虛擬函數是基類中的函數,您可以在派生類中重寫這些函數。但是在這本書的早些時候,當我學習基本繼承時,我可以在派生類中重寫基函數,而不需要使用virtual.我在這里錯過了什么?我知道虛擬函數還有更多,而且它似乎很重要,所以我想弄清楚它到底是什么。我只是在網上找不到一個直截了當的答案。
查看完整描述

3 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

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

假設你有這兩門課:

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."

到目前為止還不錯,對吧?動物吃普通食物,貓吃老鼠,都不吃。virtual.

讓我們現在稍微改變一下,這樣eat()通過一個中間函數(僅在本例中是一個平凡的函數)調用:

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

現在我們的主要職能是:

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

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

解決辦法是eat()Animal對虛擬函數進行分類:

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."

完成了。


查看完整回答
反對 回復 2019-06-01
?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

如果沒有“虛擬”,您就會得到“早期綁定”。在編譯時將根據調用的指針的類型來決定方法的實現。

與“虛擬”你得到“晚綁定”。在運行時,將根據指向對象的類型來決定該方法的實現,該對象最初是作為什么構造的。根據指向該對象的指針的類型,這不一定是您所想的。

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"

編輯-見這個問題.

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



查看完整回答
反對 回復 2019-06-01
  • 3 回答
  • 0 關注
  • 665 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號