程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 用指向基類的指針訪問成員函數

用指向基類的指針訪問成員函數

編輯:C++入門知識

[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函數。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved