網易校園招聘考察知識點--預設引數是編譯期間繫結的,而不是動態繫結
先看一個程式:
#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++堅持這種有違常規的做法呢?答案和執行效率有關。如果預設引數值被動態繫結,編譯器就必須想辦法為虛擬函式在執行時確定合適的預設值,這將比現在採用的在編譯階段確定預設值的機制更慢更復雜。做出這種選擇是想求得速度上的提高和實現上的簡便,所以大家現在才能感受得到程式執行的高效;當然,如果忽視了本條款的建議,就會帶來混亂。
相關文章
- 理解靜態繫結與動態繫結
- C++的動態繫結和靜態繫結C++
- java中的靜態繫結與動態繫結Java
- C++ — 靜態繫結與動態繫結C++
- 動態繫結和靜態繫結的簡單理解
- java繼承-靜態繫結和動態繫結Java繼承
- 動態繫結一
- php 後期靜態繫結PHP
- springmvc 引數繫結SpringMVC
- 深入理解 C++ 的動態繫結和靜態繫結C++
- 【優化】使用繫結變數 OR 不使用繫結變數,這不是問題!優化變數
- Vue select 繫結動態變數Vue變數
- SQL Server動態SQL,繫結變數SQLServer變數
- SpringMVC中的引數繫結總結SpringMVC
- 動態繫結的心得 (轉)
- Grails中如何繫結引數AI
- 【最佳化】使用繫結變數 OR 不使用繫結變數,這不是問題!變數
- silverlight中Combox繫結資料以及動態繫結預設選定項的用法
- 使用繫結變數的一點總結!變數
- 對 PHP 後期靜態繫結的理解PHP
- 關於動態字串的繫結字串
- 動態條件的繫結變數的解決變數
- JAVA動態繫結淺析Java
- 三、動態繫結屬性
- gin 註解路由,自動引數繫結工具路由
- gin自動引數繫結工具,rpc支援RPC
- sublime text 3繫結lua編譯器編譯
- 後期靜態繫結在PHP中的使用PHP
- Laravel 中的一個後期靜態繫結Laravel
- 繫結變數在靜態sql和動態sql中變數SQL
- SSL證書繫結域名還是繫結IP?
- 繫結變數變數
- vue 動態繫結 v-modelVue
- 動態繫結 input v-model
- Vue 動態繫結CSS樣式VueCSS
- 繫結變數及其優缺點變數
- 關於繫結變數的SQL繫結什麼值變數SQL
- 使用反射對繫結url引數到結構體反射結構體