天天看點

C++二級考試-考核虛函數與多态難點易混淆試題之一

#include <iostream>
using namespace std;
class Base 
{
public:
    virtual void Show() { cout << 'B'; }
};
class Derived:public Base
{
public:
    void Show () { cout<<'D'; }
};
int main(){
    Base *p1=new Derived; (1)
    Derived *p2=new Derived;(2)
    p1->Show();
    p2-> Show();
    delete p1;
    delete p2;
    return 0;
} 
運作時的輸出結果是______。
           

Base的成員函數在聲明的前面加上virtual修飾,即把該函數聲明為虛函數。除少數特殊情況外,在派生類中重定義虛函數時,函數名、形參表和傳回值類型必須保持不變。虛函數在派生類被重定義後,無論是否用virtual修飾,重定義的函數仍然是一個虛函數。對虛函數的調用有兩種方式:非多态調用和多态調用。非多态調用是指不借助于指針或引用的直接調用,多态調用是指借助于指向基類的指針或引用的調用。本題調用的是多态調用。

在C++中,一個基類指針(或引用)可以用于指向它的派生類對象,而且通過這樣的指針(或引用)調用虛函數時,被調用的是該指針(或引用)實際所指向的對象類的那個重定義版本。本題中,成員函數show為虛函數。在main函數中,第一條語句定義了指向派生類對象的基類指針p1,第二條語句定義了指向派生類對象的派生類指針p2,第三條語句通過基類指針p1調用虛函數show,被調用的是派生類中重定義的那個版本,是以輸出字元D,第四條語句通過派生類指針p2調用虛函數show,被調用的也是派生類中的那個版本,輸出字元D

是以輸出結果是 DD

繼續閱讀