天天看點

C++筆記(八):C++動态綁定

動态綁定

在C++中,若派生類中有與基類重名的函數,則使用派生類的;這叫函數覆寫;

補充一點:

  • 函數重載是發生在不同函數之間;
  • 函數覆寫是發生在基類與派生類之間;

例:

#include <iostream>

class Animal{
public: 
    Animal() {
        std::cout << "animal init" << std::endl;
    }
    ~Animal() {
        std::cout << "~animal()" << std::endl;
    }
public:
    void eat() {
        std::cout << "animal eat" << std::endl;
    }
    void sleep() {
        std::cout << "animal sleep" << std::endl;
    }
};

class Dog : public Animal
{
public:
    Dog(){
        std::cout << "Dog init" << std::endl;
    }
    ~Dog(){
        std::cout << "~Dog()" << std::endl;
    }
public:
    void eat() {
        std::cout << "Dog eat" << std::endl;
    }
    void sleep() {
        std::cout << "Dog sleep" << std::endl;
    }    
};

int main(int argc, char* argv[])
{
    Dog dog;
    dog.eat();
    printf("Hello World!\n");
    return 0;
}
           

現在定義一個

Animal

指針,讓他指向

Dog

這個類,并調用

eat

這個方法;

Animal *animal;
animal = &dog;
animal->eat();
           

我們會發現,調用的是

Animal

這個類的

eat

這個方法。

在編譯階段,編譯器會把

eat

這個方法綁定到基類中去,這叫

靜态多态

,現在我們在基類中的

eat

上加

virtual

關鍵字。

virtual void eat(){
	std::cout << "animal eat" << std::endl;
}
           

重新運作代碼,會發現調用的是

Dog

這個類的

eat

這個方法;

virtual

關鍵字告訴編譯器不要使用靜态綁定來綁定該函數,在程式運作時,再去調用的是派生類的函數還是基類中的函數;

繼續閱讀