抽象类中的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