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