在最近幾天,討論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 。
如果有錯誤 請指出 謝謝