網易校園招聘考察知識點--預設引數是編譯期間繫結的,而不是動態繫結

pengfoo發表於2012-10-07

先看一個程式:

#include <iostream>
using namespace std;

class A
{
public:
	virtual void Fun(int number = 10)
	{
		std::cout << "A::Fun with number " << number<<endl;
	}
};

class B: public A
{
public:
	virtual void Fun(int number = 20)
	{
		std::cout << "B::Fun with number " << number<<endl;
	}
};

int main()
{
	B b;
	A &a = b;
	a.Fun();
	return 0;
}                 //虛擬函式動態繫結=>B,非A,預設實參是編譯時候確定的=>10,非20 

參考:http://topic.csdn.net/t/20060127/16/4536503.html

條款38:   決不要重新定義繼承而來的預設引數值
本條款的理由就變得非常明顯:虛擬函式是動態繫結而預設引數值是靜態繫結的。 這意味著你最終可能呼叫的是一個定義在派生類,但使用了基類中的預設引數值的虛擬函式.
為什麼C++堅持這種有違常規的做法呢?答案和執行效率有關。如果預設引數值被動態繫結,編譯器就必須想辦法為虛擬函式在執行時確定合適的預設值,這將比現在採用的在編譯階段確定預設值的機制更慢更復雜。做出這種選擇是想求得速度上的提高和實現上的簡便,所以大家現在才能感受得到程式執行的高效;當然,如果忽視了本條款的建議,就會帶來混亂。

 

 

 

 


 

相關文章