繼承虛函數&數組名做參數

#include<iostream>
using namespace std;

class Base
{
public:
    virtual int foo(int x)
    {
        return x * 10;
    }

    int foo(char x[14])
    {
        return sizeof(x) + 10;
    }
};

class Derived: public Base
{
    int foo(int x)
    {
        return x * 20;
    }

    virtual int foo(char x[10])
    {
        return sizeof(x) + 20;
    }
} ;

int main()
{
    Derived stDerived;
    Base *pstBase = &stDerived;

    char x[10];
    printf("%d\n", pstBase->foo(100) + pstBase->foo(x));

    return 0;
}

在32位環境下,以上程序的輸出結果是?正確答案: C
A.2000
B.2004
C.2014
D.2024

答案解析:
注:數組名做參數時會退化爲指針
pstBase是一個指向基類Base的指針,指針裏存的是Base的子類Derived對象stdDerived的地址,pstBase->foo(100)是通過虛函數機制調用Derived的int foo (int x)函數,所以返回的值爲2000,;而pstBase->foo(x)調用的是Base類裏的int foo(char x[14])函數,返回值爲14。因此最後的結果爲2014,其中在int foo(char x[14])這個函數中,sizeof(x)計算的是指向x[14]這個數組的常量指針x,大小爲4字節(在32位系統中)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章