纯虚函数--抽象类中的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



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NHibernate初学者指南(6):映射模型到数据库之方式二

使用Fluent NHibernate自动映射 使用Fluent NHibernate自动映射&#xff0c;首先要将映射的实体放到一个命名空间中&#xff0c;这使得通知AutoMapper哪些实体和值对象包含在映射中更容易。建议在你的项目中创建一个Domain文件夹&#xff0c;将需要映射的实体和值对象放到这个文…

解决升级mac os X EI Capitan后遇到LibclangError: dlopen(libclang.dylib, 6): image not found.的问题...

打开文件./frameworks/cocos2d-x/tools/bindings-generator/clang/cindex.py 把第 3395 行 改为 &#xff1a; library cdll.LoadLibrary("../bindings-generator/libclang/" self.get_filename())转载于:https://www.cnblogs.com/HemJohn/p/4978859.html

[react] 高阶组件(HOC)有哪些优点和缺点?

[react] 高阶组件(HOC)有哪些优点和缺点&#xff1f; HOC 优点 通过传递props去影响内层组件的状态&#xff0c;不直接改变内层组件的状态&#xff0c;降低了耦合度 缺点 组件多层嵌套&#xff0c; 增加复杂度与理解成本 ref隔断&#xff0c; React.forwardRef 来解决 高阶组件…

STM32嵌入式系统FreeRTOS使用cJSON解析和构建JSON

一、环境 控制器STM32F407MDK5.34cJSON1.7.7 二、安装cJSON MDK中打开Pack Install&#xff0c;选择Generic下边MDK-Pack::cJSON&#xff0c;点击安装Install 安装成功后&#xff0c;在Manage Run-Time Environment 中找到Data Exchange&#xff0c;并选择cJSON&#xff0c;…

objectC 数据类型转换

按照数据类型占用存储不同可以自动类型转换或强制类型转换&#xff0c;总的原则是小存储容量数据类型可以自动转换成为大存储容量数据类型。 不同类型数据间按照下面关系的从左到右&#xff08;从低到高&#xff09;自动转换&#xff0c; _Bool、char、short int、枚举类型 -&g…

VC6启用运行时类型识别 (RTTI)

在程序中&#xff0c;当我们对多态类的基类指针使用typeid&#xff0c;就可以在运行时确定指针指向对象的实际类型&#xff0c;并输出对象类型的名字。 #include <cstdlib >#include <iostream >#include <typeinfo >usingnamespacestd; classB{ public …

爱快软路由设置DHCP多个LAN处于同一网段

&#xff08;0&#xff09;思路&#xff1a;eth0 启用扩展网卡&#xff0c;然后设置LAN1为DHCP。 &#xff08;1&#xff09;设置扩展网卡 &#xff08;2&#xff09;启用DHCP

[react] react16跟之前的版本生命周期有哪些变化?

[react] react16跟之前的版本生命周期有哪些变化&#xff1f; 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

前端招聘与前端卖身的困境

最近开始物色新公司&#xff0c;群里来了个招人的&#xff0c;说2.5万招高手。在众人的怂恿下&#xff0c;发了简历。 但结果是不如意的&#xff0c;经过他们一小时的评测&#xff0c;他们认为我的水平不过8k-10k&#xff0c;税前。我吐血了&#xff0c;还远低于我原来的呢&…

git 本地推送本地仓库到远程

github或者gitee远程新建空仓库&#xff0c;在本地推送已有的仓库到远程新仓库。 1、远程新建新仓库&#xff0c;例如stm32repo 2、本地仓库添加远程仓库 git remote add origin https://gitee.com/xxxx/stm32repo.git 3、本地仓库完成提交后&#xff0c;推送到远程仓库 gi…

无法对视图创建索引,因为该视图未绑定到架构

遇到这个问题&#xff0c;查了一位博主的文章&#xff0c;但是说的不是很详细&#xff0c;在这里说明白一些。 修改此问题 需要在 创建视图语句中加上 with SCHEMABINDING --创建索引视图 create view 视图名 with schemabinding as select 语句 go --创建索引视图需要注意的几…

[react] react怎么提高列表渲染的性能?

[react] react怎么提高列表渲染的性能&#xff1f; 使用webpack 做代码分割。使用hooks。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Windows编程中的映射模式和坐标转换

From: http://www.vczx.com/article/show.php?id1011820 一、Windows中的映射模式 1、Windows定义映射模式的目的 经过我的综合&#xff0c;Windows定义映射模的目的又以下几个方面&#xff1a;1、不同人的使用习惯。不同国家的&#xff0c;不同地区&#xff0c;以及不同的人…

C# 截取图片的方法

1、C#截取图片的方法 方法一、 一个像素一个像素的画&#xff0c;遍历每一个像素&#xff0c;速度慢 /// <summary> /// 截取一张图片的制定部分 /// </summary> /// <param name"bitmapPathAndName">原始图片路径名称<…

变压器油参数

以下体胀系数参考百度百科&#xff1a; 水银1.8210^-4 纯水2.0810^-4 煤油9.010^-4 酒精1.110^-3 汽油1.2410^-3 氢气3.6610^-3 氧气3.6710^-3 氨气3.8010^-3 空气 3.67610^-3 二氧化碳3.74110^-3 一切气体 ≈1/273 甘油 4.910^-4 乙醇 7.510^-4 相关&#xff1a…

Python用过的小知识备忘录

1. python中的优先权队列&#xff0c;priorityqueue用法&#xff1a;数字越小&#xff0c;表示优先级越高&#xff0c;越早被拿出 from queue import Queue from queue import PriorityQueue prioqueuePriorityQueue() prioqueue.put((1,hahaha)) prioqueue.put((5,ustc)) pr…

[react] 给组件设置很多属性时不想一个个去设置有什么办法可以解决这问题呢?

[react] 给组件设置很多属性时不想一个个去设置有什么办法可以解决这问题呢&#xff1f; es6展开运算符 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

cygwin This indicates that the /etc/passwd (and possibly /etc/group) files should be rebuilt 问题解决办法

From: http://blog.csdn.net/deaboway/article/details/6461587 我的Cygwin报&#xff1a; [css] view plaincopyYour group is currently "mkpasswd". This indicates that the /etc/passwd (and possibly /etc/group) files should be rebuilt. See the man p…

CSS布局教程:用DIV CSS实现国内经典式三行两列布局-CSS布局实例

我们碰到过很多的企业网站或其它小型的展示类网站&#xff0c;有一些共同的特点&#xff0c;即顶部放一个大的导航或BANNER&#xff0c;右侧是链接或图片&#xff0c;左侧放置内容&#xff0c;页面底部放置版权信息等。这样的形式是国内经典式的布局&#xff0c;我们这里不对它…

EC20模组使用MQTT库对接EMQX,基于STM32F407

一、说明 本lib库基于STM32F407编译&#xff0c;其他的cortexM4内核也支持&#xff0c;采用串口和EC20模组通信。 库包括两个文件&#xff1a;ec20_mqtt.h和ec20_mqtt.lib。使用时添加lib文件到工程中&#xff0c;头文件引用ec20_mqtt.h即可。 下载&#xff1a;https://gitee…