日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

纯虚函数--抽象类中的this到底指的是哪个子类实例呢

發布時間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 纯虚函数--抽象类中的this到底指的是哪个子类实例呢 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

抽象類中的this到底指的是哪個子類實例呢?請看代碼:

thread.h

#ifndef __THREAD_H__ #define __THREAD_H__#include <iostream>#define PATTERN_SINGLETON_DECLARE(classname) \ private: \classname(); \ public: \static classname * instance(); \virtual ~classname();#define PATTERN_SINGLETON_IMPLEMENT(classname) \ classname * classname::instance() \ { \static classname * _instance = NULL; \if( NULL == _instance) \{ \_instance = new classname; \} \return _instance; \ }class CThread {friend void ThreadBody(void *pdat);public:CThread();~CThread();bool CreateThread();virtual void ThreadProc(const std::string &name) = 0;protected:bool m_bLoop;std::string m_name; };class CCaptureManager: public CThread {PATTERN_SINGLETON_DECLARE(CCaptureManager) public:void start();private:void ThreadProc(const std::string &name);private:int m_pid; };#define g_captureManager (*CCaptureManager::instance())class CCaptureManager2: public CThread {PATTERN_SINGLETON_DECLARE(CCaptureManager2) public:void start();private:void ThreadProc(const std::string &name); };#define g_captureManager2 (*CCaptureManager2::instance())#endif
thread.cpp

#include <stdio.h> #include "thread.h"PATTERN_SINGLETON_IMPLEMENT(CCaptureManager)void ThreadBody(void *pdat) {CThread *pThread = (CThread *)pdat;//pThread->ThreadProc();pThread->ThreadProc(pThread->m_name); }CThread::CThread() {m_bLoop = true;m_name = "Base";printf("CThread-this=%x, name=%s\n", this, m_name.c_str()); }CThread::~CThread() {}bool CThread::CreateThread() {printf("CThread::CreateThread-this=%x, m_bLoop=%d\n", this, m_bLoop);ThreadBody(this); // 這里的this為具體對象實例的指針return true; }CCaptureManager::CCaptureManager() {m_pid = 10;m_name = "CCaptureManager";printf("CCaptureManager-this=%x, m_bLoop=%d\n", this, m_bLoop); }CCaptureManager::~CCaptureManager() {}void CCaptureManager::start() {printf("%s()\n", __FUNCTION__);CreateThread(); }void CCaptureManager::ThreadProc(const std::string &name) {printf("CCaptureManager::ThreadProc()-%dL, name=%s------\n", __LINE__, name.c_str()); }PATTERN_SINGLETON_IMPLEMENT(CCaptureManager2)CCaptureManager2::CCaptureManager2() {m_name = "CCaptureManager2";printf("CCaptureManager2-this=%x\n", this); }CCaptureManager2::~CCaptureManager2() {}void CCaptureManager2::start() {printf("%s\n", __FUNCTION__);CreateThread(); }void CCaptureManager2::ThreadProc(const std::string &name) {printf("CCaptureManager2::ThreadProc()-%dL, name=%s------\n", __LINE__, name.c_str()); }
a.cpp

#include <iostream> #include <typeinfo> #include "thread.h"using namespace std;int main() {cout << sizeof(CThread) << ", " << sizeof(CCaptureManager) << ", " << sizeof(CCaptureManager2) << endl; // 12, 16, 12g_captureManager.start();cout << "--------------------------\n\n";g_captureManager2.start();cout << typeid(g_captureManager).name() << endl;cout << typeid(g_captureManager2).name() << endl;cout << typeid(CCaptureManager).name() << endl;if(typeid(g_captureManager) == typeid(CCaptureManager))cout << "true" << endl;elsecout << "false" << endl;return 0; }/* 運行情況: D:\profile\Desktop\test1>make g++ -o a.exe a.cpp thread.cppD:\profile\Desktop\test1>a 12, 16, 12 CThread-this=692a70, name=Base // 基類構造函數: CThread::CThread() CCaptureManager-this=692a70, m_bLoop=1 // CCaptureManager構造函數 start() // CCaptureManager::start() CThread::CreateThread-this=692a70, m_bLoop=1 // CThread::CreateThread() CCaptureManager::ThreadProc()-53L, name=CCaptureManager------ // CCaptureManager->ThreadBody() --------------------------CThread-this=692a88, name=Base // 基類構造函數: CThread::CThread() CCaptureManager2-this=692a88 // CCaptureManager2構造函數 start // CCaptureManager2::start() CThread::CreateThread-this=692a88, m_bLoop=1 // CThread::CreateThread() CCaptureManager2::ThreadProc()-78L, name=CCaptureManager2------ // CCaptureManager2->ThreadBody()15CCaptureManager 16CCaptureManager2 15CCaptureManager true注: 雖然在創建CCaptureManager和CCaptureManager2的實例時,都調用了基類的構造函數,但是從輸出的結果可以看出: this的值是不一樣的, 而且都等于實例中的this!*/
在linux下用g++編譯和在windows上用vc6編譯,得到typeid()的輸出不一樣,這可能是由于具體的實現不同導致的!以實際運行環境為準!

在vc6中要啟用RTTI支持,具體見:http://blog.csdn.net/joeblackzqq/article/details/9281705



總結

以上是生活随笔為你收集整理的纯虚函数--抽象类中的this到底指的是哪个子类实例呢的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。