C Virtual關鍵字的非常規使用

2021-06-16 13:45:10 字數 1551 閱讀 2295

今日,在工作中遇到了一種以前從沒見過的virtual關鍵字的用法,起初百思不得其解,而後搜尋了一下資料進行閱讀後算是得出乙個說得通的解釋。
問題如下:c++ dll匯出類匯出函式很常見,當間接方式匯出類時,類非靜態成員必須加virtual關鍵字。否則使用該dll的工程會出現鏈結錯誤。
test_class.h
#pragma once
class testclassa
;
test_class.cpp
#include "stdafx.h"
#include "test_class.h"
testclassa* testclassa::getinstance()
void testclassa::funa()
inte***ce.h
#include "test_class.h"
#ifdef test_exports
#ifndef test_api
#define test_api __declspec(dllexport)
#endif
#else
#ifndef test_api
#define test_api __declspec(dllimport)
#endif
#endif
test_api testclassa* getclassa();
#include "inte***ce.h"
testclassa* getclassa()
///
呼叫的工程
#include "../nakilib/inte***ce.h"
int _tmain(int argc, _tchar* argv)
對此,我能給出的解釋是:簡單地說,通過virtual關鍵字,使呼叫的工程在編譯時,因為virtual的特性,無需知道其實現,如果不加這個關鍵字,就需要funa的具體實現,但是因為沒有匯出,所以會鏈結錯誤。換句話說,這種用法更像是使了點小手段,如果使用c語言來編寫,應該無法實現這種間接匯出。

q.為什麼所有成員函式均為虛函式。

a:如果不是虛函式,其實再連線的時候成員函式是會連線**到.exe裡面去的,這樣就根本call不到dll裡面的函式,也就沒有實現我們的原意。

而虛函式是通過函式指標呼叫的,exports類是再dll裡面構造,所以可以保證虛函式是call到dll裡面,而且.exe只需要dll的標頭檔案即可編譯連線通過。

真是充分利用了virtual這個關鍵字的特性啊

編譯過程的一些小知識——lib與dll的區別

編譯過程的一些小知識——內部連線與外部連線

C virtual關鍵字理解

在c 語言中,從 到程式的執行,要經歷編譯和連線,針對這兩個不同的階段,c 設計了不同的機制,其中vitual和inline就是區分編譯器工作和鏈結器工作的標誌 inline很容易理解,生命為inline的函式在編譯階段即被展開成 而非inline的函式採用執行時鏈結的方式處理 vitual關鍵字,...

C virtual關鍵字理解

在c 語言中,從 到程式的執行,要經歷編譯和連線,針對這兩個不同的階段,c 設計了不同的機制,其中vitual和inline就是區分編譯器工作和鏈結器工作的標誌 inline很容易理解,生命為inline的函式在編譯階段即被展開成 而非inline的函式採用執行時鏈結的方式處理 vitual關鍵字,...

C virtual關鍵字理解

在c 語言中,從 到程式的執行,要經歷編譯和連線,針對這兩個不同的階段,c 設計了不同的機制,其中vitual和inline就是區分編譯器工作和鏈結器工作的標誌 inline很容易理解,生命為inline的函式在編譯階段即被展開成 而非inline的函式採用執行時鏈結的方式處理 vitual關鍵字,...