C++ 兩個有趣的問題(靜態動態綁定,和類指針指向空的實質)

在最近幾天,討論C++的基礎問題和實質問題的時候,發現了幾個根本想不到的問題。特意來分享!

1.關於虛函數有缺省形參時候的表現。

#include<iostream>
using namespace std;
class A
{
public:
    virtual void Foo(int i = 2)
    {
        cout << i;
    }
};

class B: public A
{
public:
    void Foo(int i = 4)
    {
        cout << i;
    }
};

int main()
{
    A* pA = new B;
    B* pB = new B;
    pA->Foo();
    pB->Foo();
    system("pause");
    return 0;
}

簡單介紹下代碼。 B 繼承 A, 然後 A 和 B 都有一虛函數 Foo(). Foo 有個 int 缺省形參。
因爲是虛函數, 所以 A* pA = new B; B* pB = new B; 都動態綁定了B。 然後輸出的結果看起來應該是
44. 結果是 24. 很神奇吧。後面查了下。 缺省形參是靜態綁定的。 稍微推論下, 虛函數列表中,不存缺省形參。 不信可以試下。

2.如果一個類指針指向空了。這個指針還能調用函數嗎?

#include<iostream>
using namespace std;
class A
{
public:
    void Foo()
    {
        cout << "Hello World";
    }
};
int main()
{
    A* pA = NULL;
    pA->Foo();
    system("pause");
    return 0;
}

這個程序, 編譯正確, 運行正常, 輸出結果爲“Hello World”.
理由,雖然 pA 指向了 NULL, 但是pA在調用過程中, 沒用this指針調用過任何東西, 直接就是調用cout 函數。 後面有時間可以用匯編看看, 我猜測, 是直接調用call 。

如果有錯誤 請指出 謝謝

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