[cpp]
/*
* Copyright (c) 2013, 煙台大學計算機學院
* All rights reserved.
* 文件名稱:test.cpp
* 作者:樊露露
* 完成日期:2013 年 5 月 31 日
* 版本號:v1.0
*
* 輸入描述:無
* 問題描述:
* 程序輸出:
* 問題分析:
* 算法設計:略
*/
/*
* Copyright (c) 2013, 煙台大學計算機學院
* All rights reserved.
* 文件名稱:test.cpp
* 作者:樊露露
* 完成日期:2013 年 5 月 31 日
* 版本號:v1.0
*
* 輸入描述:無
* 問題描述:
* 程序輸出:
* 問題分析:
* 算法設計:略
*/
先看一段程序:
[cpp]
#include <iostream>
using namespace std;
class Vehicle //交通工具
{
public:
void run() const
{
cout<<"run a vehicle"<<endl;
}
};
class Car:public Vehicle//汽車
{
public:
void run() const
{
cout<<"run a car."<<endl;
}
};
class Airplane:public Vehicle//飛機
{
public:
void run() const
{
cout<<"run a airplane."<<endl;
}
};
int main()
{
cout<<"(a) 直接用對象訪問成員函數:"<<endl;
Vehicle v;
v.run();
Car car;
Airplane airplane;
car.run();
airplane.run();
cout<<"(b) 用指向基類的指針訪問成員函數:"<<endl;
Vehicle *vp;
vp=&car;
vp->run();
vp=&airplane;
vp->run();
return 0;
}
#include <iostream>
using namespace std;
class Vehicle //交通工具
{
public:
void run() const
{
cout<<"run a vehicle"<<endl;
}
};
class Car:public Vehicle//汽車
{
public:
void run() const
{
cout<<"run a car."<<endl;
}
};
class Airplane:public Vehicle//飛機
{
public:
void run() const
{
cout<<"run a airplane."<<endl;
}
};
int main()
{
cout<<"(a) 直接用對象訪問成員函數:"<<endl;
Vehicle v;
v.run();
Car car;
Airplane airplane;
car.run();
airplane.run();
cout<<"(b) 用指向基類的指針訪問成員函數:"<<endl;
Vehicle *vp;
vp=&car;
vp->run();
vp=&airplane;
vp->run();
return 0;
}
這段程序輸出的結果為:
可以看見(B)用指向基類的指針訪問成員函數下面輸出的都是“run a vehicle。”,而我們的目的卻不是這樣的。
我們可以修改基類而讓後面的輸出發生改變:
[cpp]
class Vehicle //交通工具
{
public:
virtual void run() const
{
cout<<"run a vehicle"<<endl;
}
};
class Vehicle //交通工具
{
public:
virtual void run() const
{
cout<<"run a vehicle"<<endl;
}
};在基類中成員函數run前面加上virtual,就可以改變輸出結果,我們來看看結果:
從圖中我們可以看出在(B)中輸出結果發生了改變。
是因為 在基類中的成員函數 run 前面 加了一個 virtual,使run函數變成了虛函數,在聲明Car和Airplane這兩個派生類時 虛函數run會被重載,這樣,基類中的虛函數run會被派生類中的同名函數取代,所以,在調用run函數時就調用的派生類中的run函數。