常見的不不能宣告為虛擬函式
常見的不不能宣告為虛擬函式的有:普通函式(非成員函式);靜態成員函式;內聯成員函式;建構函式;友元函式。
1、為什麼C++不支援普通函式為虛擬函式?
普通函式(非成員函式)只能被overload,不能被override,宣告為虛擬函式也沒有什麼意思,因此編譯器會在編譯時邦定函式。
2、為什麼C++不支援建構函式為虛擬函式?
這個原因很簡單,主要是從語義上考慮,所以不支援。因為建構函式本來就是為了明確初始化物件成員才產生的,然而virtual function主要是為了再不完全瞭解細節的情況下也能正確處理物件。另外,virtual函式是在不同型別的物件產生不同的動作,現在物件還沒有產生,如何使用virtual函式來完成你想完成的動作。(這不就是典型的悖論)
3、為什麼C++不支援內聯成員函式為虛擬函式?
其實很簡單,那行內函數就是為了在程式碼中直接展開,減少函式呼叫花費的代價,虛擬函式是為了在繼承後物件能夠準確的執行自己的動作,這是不可能統一的。(再說了,inline函式在編譯時被展開,虛擬函式在執行時才能動態的邦定函式)
4、為什麼C++不支援靜態成員函式為虛擬函式?
這也很簡單,靜態成員函式對於每個類來說只有一份程式碼,所有的物件都共享這一份程式碼,他也沒有要動態邦定的必要性。
5、為什麼C++不支援友元函式為虛擬函式?
因為C++不支援友元函式的繼承,對於沒有繼承特性的函式沒有虛擬函式的說法。
*********************************************************************
1、頂層函式:多型的執行期行為體現在虛擬函式上,虛擬函式通過繼承方式來體現出多型作用,頂層函式不屬於成員函式,是不能被繼承的。
2、建構函式:(1)建構函式不能被繼承,因而不能宣告為virtual函式。
(2)建構函式一般是用來初始化物件,只有在一個物件生成之後,才能發揮多型的作用,如果將建構函式宣告為virtual函式,則表現為在物件還沒有生成的情況下就使用了多型機制,因而是行不通的,如下例:
#include <iostream>
using namespace std;
class B
{
public:
B(){}
virtualvoid show()
{
cout<<"***"<<endl;
}
};
class D:public B
{
public:
D(){}
voidshow()
{
cout<<"==="<<endl;
}
};
int main(void)
{
B*pb;
Dd; //先生成物件
pb=&d;
pb->show();//再體現多型
pb=newD(); //先呼叫建構函式
pb->show();//再多型
deletepb;
return0;
}
3、static函式:不能被繼承,只屬於該類。
4、友元函式:友元函式不屬於類的成員函式,不能被繼承。
5、inline函式:inline函式和virtual函式有著本質的區別,inline函式是在程式被編譯時就展開,在函式呼叫處用整個函式體去替換,而virtual函式是在執行期才能夠確定如何去呼叫的,因而inline函式體現的是一種編譯期機制,virtual函式體現的是一種執行期機制。此外,一切virtual函式都不可能是inline函式。
相關文章
- Java常見知識點彙總(④)——虛擬函式、抽象函式、抽象類、介面Java函式抽象
- 虛擬函式,虛擬函式表函式
- 虛擬函式 純虛擬函式函式
- 介面、虛擬函式、純虛擬函式、抽象類函式抽象
- [Lang] 虛擬函式函式
- 虛擬函式的呼叫原理函式
- 虛擬機器的常見問題虛擬機
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- 常見函式之單行函式函式
- 虛擬函式的實現原理函式
- C++之類解構函式為什麼是虛擬函式C++函式
- php常見的危險函式PHP函式
- c++虛擬函式表C++函式
- 虛擬函式與多型函式多型
- 內聯(inline)函式與虛擬函式(virtual)的討論inline函式
- python常見內建函式Python函式
- 詳解常見的損失函式函式
- 06函式宣告函式
- C++ 介面(純虛擬函式)C++函式
- C++ 虛擬函式表解析C++函式
- 深入C++成員函式及虛擬函式表C++函式
- JavaScript 五大常見函式JavaScript函式
- js常見函式總結(一)JS函式
- 使用python繪出常見函式Python函式
- 【SQL Server】常見系統函式SQLServer函式
- MySQL教程之常見函式(四)MySql函式
- react常見幾種事件宣告React事件
- 在Linux中,什麼是虛擬化?並且列出常見的虛擬化技術。Linux
- 虛擬函式的記憶體佈局(上)函式記憶體
- 關於虛擬函式的一些理解函式
- C++多型之虛擬函式C++多型函式
- 抽象基類和純虛擬函式抽象函式
- JS變數宣告和函式宣告提升JS變數函式
- python語言幾個常見函式的使用Python函式
- JavaScript函式宣告和函式表示式區別JavaScript函式
- 何時使用函式表示式與函式宣告函式
- python和Keras.backend常見函式PythonKeras函式
- Python常見工廠函式用法示例Python函式