1. 程式人生 > >c++靜態成員函式為什麼不能為虛擬函式?

c++靜態成員函式為什麼不能為虛擬函式?

其實我覺得這個問題沒有回答的必要,屬於語言概念層面的東西。
class A { 
int fun1() { ... }
static int func2() { ... }
}
首先你要搞清楚什麼是普通成員函式。成員函式是類例項相關的,不同的例項物件呼叫成員函式結果一般都不同。
比如,上面的fun1是成員函式,你進行呼叫:
A *a1 = new A;A *a2 = new A;
a1->fun1();
a2->fun1();

一般來說,a1和a2調研fun1的結果會不同。成員函式在不同的實現裡面設計不同,但大致都是在引數列表中隱式傳入一個this指標指代當前例項。

靜態函式,它其實就是普通函式。靜態函式跟類例項沒有關係,用a1和a2去呼叫結果一致,甚至於可以用A.fun2()的方式呼叫。靜態函式呼叫時不會隱式傳入this指標。

簡而言之,成員函式例項相關,靜態函式類相關。

虛擬函式,是一種特殊的成員函式,用來實現執行時多型的。

所以靜態函式不可能是虛擬函式。

至於虛擬函式有什麼特點,什麼是多型,請自行Bing之。

相關推薦

新手學C/C++:解構函式是否必須虛擬函式?什麼情況下才應該定義解構函式虛擬函式

多型是面向物件的一個基本屬性,包括靜態多型(編譯階段)和動態多型(執行階段),靜態多型主要是指函式引數不同產生的多型性,是在編譯階段可以識別的一種多型機制,而執行時多型則主要用於基類指標指向派生類物件時,可以通過基類指標直接呼叫派生類的物件函式,當然這種多型是通過虛擬函式實現的。 虛擬函式的目的

C++中解構函式虛擬函式時呼叫發生了什麼變化

昨天去XX公司面試,面試官問了一個關於C++類解構函式為虛擬函式時,如果是父類的指標用子類來new,如果發生析構時,解構函式是virtual與不是virtual有什麼區別。當時答的不好,回來總結了一下,在機器上實現了一遍,終於搞明白了。記錄下來,以後遇到這種情況自己一定不要

C++之靜態成員函式為什麼不能虛擬函式

應該知道靜態成員函式屬於類,也屬於物件,但終歸屬於類,他在記憶體中只有一份。而虛擬函式必須根據物件型別才能知道呼叫哪一個虛擬函式,故虛擬函式是一定要在物件的基礎上才可以的,兩者一個終歸屬於類,一個必依賴

c++靜態成員函式為什麼不能虛擬函式

其實我覺得這個問題沒有回答的必要,屬於語言概念層面的東西。 class A {  int fun1() { ... } static int func2() { ... } } 首先你要搞清楚什麼是普通成員函式。成員函式是類例項相關的,不同的例項物件呼叫成員函式結果一般都不同。 比如,上面的fun1是成員函式

C/C++基類的解構函式為什麼必須定義虛擬函式

C/C++基類的解構函式為什麼必須定義為虛擬函式?   為什麼基類的解構函式是虛擬函式? 在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。 (1)第一種情況:沒有多型,建立派生類物件,基類的解構函式不是虛擬函式 #include<

C++函式中那些不可以被宣告虛擬函式函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++靜態成員靜態函式

C++類的靜態成員變數是需要初始化的,實際上不是為了初始化而初始化,本質上是要定義,分配記憶體。需要在類的外部進行定義。 靜態成員變數: 靜態成員變數和常用的全域性變數比較類似。 先看一個頭檔案animal.h #ifndef DUOTAIJINGTAI_ANIMAL_H #defi

C++ 基類的解構函式為什麼需要定義虛擬函式

主要是因為當通過父類的指標或引用指向子類的物件時,刪除子類時父類的解構函式不能被呼叫造成記憶體洩露。 1.當基類的引用指向基類的物件 #include<iostream> #include<cstring> #include<cstdlib> using

C++中為什麼建構函式不能定義虛擬函式

關於C++為什麼不支援虛擬建構函式,Bjarne很早以前就在C++Style and Technique FAQ裡面做過回答 Avirtual call is a mechanism to get work done given partialinformation. In particular

C++ 靜態成員函式 訪問 類成員變數 & 函式指標、函式指標陣列、函式指標陣列指標的使用 & 回撥函式的使用

靜態成員函式可以通過引用類物件訪問類成員變數;test.h#ifndef TEST_H #define TEST_H class Test { public: Test(); Tes

C++之建構函式為什麼不能虛擬函式

針對虛擬函式在說虛擬函式表的時候已經說過了 C++之虛擬函式表,虛擬函式的執行是根據虛擬函式表,而虛擬函式表是在物件生成後,釋放前才存在的,建構函式就是來生成物件的,物件還沒有生成,就把建構函式宣告為了虛擬函式,放到了虛擬函式表中,可是虛擬函式表又不存在,這就矛

(轉載)(C++)淺談多型基類解構函式宣告虛擬函式

主要內容: 1、C++類繼承中的建構函式和解構函式 2、C++多型性中的靜態繫結和動態繫結 3、C++多型性中解構函式宣告為虛擬函式 1、C++類繼承中的建構函式和解構函式 在C++的類繼承中, 建立物件時,首先呼叫基類的建構函式,然後在呼叫下一

C++)淺談多型基類解構函式宣告虛擬函式

主要內容: 1、C++類繼承中的建構函式和解構函式 2、C++多型性中的靜態繫結和動態繫結 3、C++多型性中解構函式宣告為虛擬函式 1、C++類繼承中的建構函式和解構函式 在C++的類繼承中, 建立物件時,首先呼叫基類的建構函式,然後在呼叫下一個派生類的建構函式,依次類推; 析構物件時,其

C++中建構函式、解構函式虛擬函式及普通成員函式的理解

這裡我們主要討論建構函式、解構函式、普通成員函式、虛擬函式,對這幾種函式說說自己的理解。 對建構函式的總結 對建構函式,我們先來看看如下的程式碼 #include <iostream> using namespace std; cla

C++靜態成員函式訪問非靜態成員變數的方法

靜態成員函式不能訪問非靜態成員,這是因為靜態函式屬於類而不是屬於整個物件,靜態函式中的 member可能都沒有分配記憶體。靜態成員函式沒有隱含的this自變數。所以,它就無法訪問自己類的非靜態成員。但

C++:為什麼在繼承關係中,父類的解構函式最好定義虛擬函式

我們先來看一段簡單程式碼,A類有一個指標成員_pa,B類公有繼承了A類,然後自己有一個指標成員_pb: class A{ public: A(int x = 1) :_pa(new int(x)) {} ~A()

C++解構函式為什麼要虛擬函式

  在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。   a.第一段程式碼 #include<iostream> using namespace std; class ClxBase{ public: ClxBase() {}; ~ClxBa

C++靜態成員靜態資料成員靜態函式成員

由關鍵字static修飾說明的類成員,成為靜態類成員(static class member),包括:靜態資料成員和靜態函式成員。類的靜態成員為其所有物件共享,不管有多少物件,靜態成員只有一份存於公用記憶體中。 雖然使用static修飾說明,但與函式中的靜態變數有明顯差異。

c++中不能被申明虛擬函式函式

常見的不不能宣告為虛擬函式的有:普通函式(非成員函式);靜態成員函式;內聯成員函式;建構函式;友元函式。 1.為什麼C++不支援普通函式為虛擬函式? 普通函式(非成員函式)只能被overload,不能被override,宣告為虛擬函式也沒有什麼意思,因此編譯器會在編譯時邦定

C++基類解構函式宣告虛擬函式

先來看幾段程式例子:1. 將基類解構函式宣告為虛擬函式#include <iostream