c++中有一個很好的特性,通過動态綁定我們能夠編寫使用繼承層次中的任意對象,這樣做可以在定義函數的時候可以隻聲明基類的形參但調用的時候可以使用任何的繼承層次中的對象
類的繼承和虛函數,使我們可以使用c++中的動态綁定。
#include <iostream>
using namespace std;
//基類
class base
{
protected:
int cat;
public:
base():cat(0){}
virtual void print_cat()
{
cout<< cat << endl;
}
};
class derive:public base
{
public:
derive()
{
cat = 1;
}
void print_cat()
{
cout<< cat << endl;
}
};
void fun(base &b)
{
b.print_cat();
}
int main()
{
base A;
derive B;
fun(A);//使用基類對象調用函數
fun(B);//使用派生類對象調用函數
return 0;
}
調用後結果是0 1
在c++中通過基類的引用(或指針)調用虛函數是,引用(或指針)既可以指向基類對象也可以指向派生類對象,指向的對象的類型是引用(或指針)所指向對象的類型。
大家看到基類和派生類都定義了自己的print_cat函數;
那如果派生類不定義自己的print_cat函數呢?我們來看下代碼:#include <iostream>
using namespace std;
//基類
class base
{
protected:
int cat;
public:
base():cat(0){}
virtual void print_cat()
{
cout<< cat << endl;
}
};
class derive:public base
{
public:
drive()
{
cat = 1;
}
};
void fun(base &b)
{
b.print_cat();
}
int main()
{
base A;
derive B;
fun(A);//使用基類對象調用函數
fun(B);//使用派生類對象調用函數
return 0;
}
最後執行結果為 0 0
看來來後一個調用了基類的print_cat函數;
這是為什麼呢?因為c++ 規定如果派生類沒有重定義某個虛函數,則使用基類中定義的版本。