成員虛函數(shù)和基類指針

對(duì)于如下代碼:

//Base.cpp
#include<iostream>
using namespace std;
class  Base
{ 
public :      
    Base(char xx)  { x = xx; }
    virtual void who()  
    { 
        cout << "Base class: " << x << "\n" ; 
    }
protected:    
    char x;
} ;
class  First_d : public  Base
{ 
public :       
    First_d(char xx, char yy):Base(xx)  
    { 
        y = yy;
    }
    void who()  
    { 
        cout << "First derived class: "<< x << ", " << y << "\n" ; }
protected:    
    char y;
} ;
class  Second_d : public  First_d
{ 
public :
    Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) 
    { 
        z = zz; 
    } 
    void who()  
    { 
        cout << "Second derived class: "<< x << ", " << y << ", " << z << "\n" ;
    }
protected:    
    char z;
} ;
void main()
{ 
    Base  B_obj( 'A' ) ;   
    First_d F_obj( 'T', 'O' ) ;  
    Second_d S_obj( 'E', 'N', 'D' ) ;
    Base  * p ;
    p = & B_obj ;    p -> who() ;
    p = &F_obj ;     p -> who() ;
    p = &S_obj ;     p -> who() ;
    F_obj.who() ;
    ( ( Second_d * ) p ) -> who() ;
    while(1);
}

我們注意到Base類中的void who()函數(shù)添加了關(guān)鍵字virtual
上述代碼塊運(yùn)行結(jié)果如下:

Base class: A
First derived class: T, O
Second derived class: E, N, D
First derived class: T, O
Second derived class: E, N, D

假如去掉who()前的關(guān)鍵字virtual,運(yùn)行結(jié)果會(huì)變?yōu)椋?/p>

Base class: A
Base class: T
Base class: E
First derived class: T, O
Second derived class: E, N, D

發(fā)生這樣的情況的關(guān)鍵是:virtual關(guān)鍵字使得 隨著p指向不同對(duì)象,this指針作類型轉(zhuǎn)換執(zhí)行不同實(shí)現(xiàn)版本

溫馨提示:

  1. 一個(gè)虛函數(shù),在派生類層界面相同的重載函數(shù)都保持虛特性
  2. 虛函數(shù)必須是類的成員函數(shù)
  3. 不能將友員說明為虛函數(shù),但虛函數(shù)可以是另一個(gè)類的友員
  4. 析構(gòu)函數(shù)可以是虛函數(shù),但構(gòu)造函數(shù)不能是虛函數(shù)
  5. 在派生類中重載基類的虛函數(shù)要求函數(shù)名、返回類型、參數(shù)個(gè)數(shù)、
    參數(shù)類型和順序完全相同
  6. 如果僅僅返回類型不同,C++認(rèn)為是錯(cuò)誤重載
  7. 如果函數(shù)原型不同,僅函數(shù)名相同,丟失虛特性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這是知乎上c++虛函數(shù)的作用https://www.zhihu.com/question/23971699CSDN...
    吳業(yè)鵬閱讀 1,238評(píng)論 0 1
  • C++虛函數(shù) C++虛函數(shù)是多態(tài)性實(shí)現(xiàn)的重要方式,當(dāng)某個(gè)虛函數(shù)通過指針或者引用調(diào)用時(shí),編譯器產(chǎn)生的代碼直到運(yùn)行時(shí)才...
    小白將閱讀 1,805評(píng)論 4 19
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,686評(píng)論 1 51
  • 我們知道,在同一類中是不能定義兩個(gè)名字相同、參數(shù)個(gè)數(shù)和類型都相同的函數(shù)的,否則就是“重復(fù)定義”。但是在類的繼承層次...
    踩在浪花上00閱讀 531評(píng)論 0 1
  • fuckwe7,過河拆橋,卸磨殺驢,在國內(nèi)最常見不過了。
    chaosii閱讀 284評(píng)論 0 0

友情鏈接更多精彩內(nèi)容