欢迎访问 生活随笔!

生活随笔

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

编程问答

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

发布时间:2023/12/9 编程问答 58 豆豆
生活随笔 收集整理的这篇文章主要介绍了 纯虚函数--抽象类中的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到底指的是哪个子类实例呢的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。