纯虚函数--抽象类中的this到底指的是哪个子类实例呢
生活随笔
收集整理的這篇文章主要介紹了
纯虚函数--抽象类中的this到底指的是哪个子类实例呢
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
抽象類中的this到底指的是哪個(gè)子類實(shí)例呢?請(qǐng)看代碼:
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())#endifthread.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為具體對(duì)象實(shí)例的指針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; }/* 運(yùn)行情況: 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 // 基類構(gòu)造函數(shù): CThread::CThread() CCaptureManager-this=692a70, m_bLoop=1 // CCaptureManager構(gòu)造函數(shù) start() // CCaptureManager::start() CThread::CreateThread-this=692a70, m_bLoop=1 // CThread::CreateThread() CCaptureManager::ThreadProc()-53L, name=CCaptureManager------ // CCaptureManager->ThreadBody() --------------------------CThread-this=692a88, name=Base // 基類構(gòu)造函數(shù): CThread::CThread() CCaptureManager2-this=692a88 // CCaptureManager2構(gòu)造函數(shù) start // CCaptureManager2::start() CThread::CreateThread-this=692a88, m_bLoop=1 // CThread::CreateThread() CCaptureManager2::ThreadProc()-78L, name=CCaptureManager2------ // CCaptureManager2->ThreadBody()15CCaptureManager 16CCaptureManager2 15CCaptureManager true注: 雖然在創(chuàng)建CCaptureManager和CCaptureManager2的實(shí)例時(shí),都調(diào)用了基類的構(gòu)造函數(shù),但是從輸出的結(jié)果可以看出: this的值是不一樣的, 而且都等于實(shí)例中的this!*/
在linux下用g++編譯和在windows上用vc6編譯,得到typeid()的輸出不一樣,這可能是由于具體的實(shí)現(xiàn)不同導(dǎo)致的!以實(shí)際運(yùn)行環(huán)境為準(zhǔn)!
在vc6中要啟用RTTI支持,具體見:http://blog.csdn.net/joeblackzqq/article/details/9281705
總結(jié)
以上是生活随笔為你收集整理的纯虚函数--抽象类中的this到底指的是哪个子类实例呢的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星智能家居系统频繁故障 大批用户受到影
- 下一篇: 【计算机技术】我用两句话在电脑课上解除了