c++ - 为什么从模板类和抽象类继承 C++ 类会导致类成员重复?
问题描述
我有以下 C++ 代码
配置.h
#include <cstdint>
typedef struct
{
uint8_t id;
uint32_t data;
} Config;
处理程序.h
class HandlerBase
{
public:
typedef void (*func_ptr)(void *data);
HandlerBase(func_ptr function) : function(function) {}
private:
func_ptr function;
};
template<class T>
class Handler : public HandlerBase
{
public:
Handler() : HandlerBase(&fun_01) {}
private:
static void fun_01(void *data) {}
};
AbstractBase.h
class AbstractBase
{
public:
virtual void method_01() = 0;
virtual void method_02() = 0;
};
啊
#include "AbstractBase.h"
#include "Handler.h"
#include "Configuration.h"
class A : public Handler<A>, public AbstractBase
{
public:
A();
void method_01();
void method_02();
private:
Config cfg;
};
A.cpp
#include "A.h"
A::A() {}
void A::method_01() {}
void A::method_02() {}
主文件
int main(int argc, char** argv) {
A a;
return 0;
}
如果我在调试器中单步执行了代码,我注意到每当我在a
实例中创建A
类的实例时,main
该a
实例都包含cfg
结构的两个实例。这是我的调试器的输出(我一直在 Netbeans IDE v8.2 下使用 GDB 和 g++ 编译器(v 4.6.3)。在 Windows 10 Pro 下)
EDIT_01:
我发现我只能将值存储到其中一个cfg
实例中。分配到结构项目后
cfg.id = 0x55;
cfg.data = 0xAAAAAAAA;
我可以看到cfg
结构的以下内容
如果我观察地址处的内存0xffffcbd0
内容(this
指针的内容),我会看到以下内容(一个字节的id
项目,三个填充字节,后跟四个字节的data
项目)
EDIT_02:
我已将以下给定方法添加到A
类中
void A::init()
{
cfg.id = 0x55;
cfg.data = 0xAAAAAAAA;
}
并按method_01
以下方式修改
void A::method_01()
{
if ((cfg.data == 0xAAAAAAAA) && (cfg.id == 0x55)) {
std::cout << "Config ok!" << std::endl;
}
}
这main.cpp
int main(int argc, char** argv) {
A a;
a.init();
a.method_01();
return 0;
}
打印Config ok!
消息。
同时只cfg
创建一个 struct 实例,以防A
类仅从Handler
. 请问谁能告诉我这种行为的原因是什么?有什么办法可以避免类成员的这种重复?提前致谢。
解决方案
推荐阅读
- azure-devops - 对用户隐藏项目列表中的团队?
- elasticsearch - 需要 ElasticSearch 聚合帮助
- jquery - jquery动态添加textarea并监听输入事件
- r - 如何关闭在 Plotly 中显示我所有数据的工具提示?
- java - 如何打开网页并点击元素?
- flex-lexer - 如何为同一文本调用多个词法分析器?
- android - 是否可以更改 apk 的签名?
- typescript - TypeScript如何为空数组定义元组类型?
- c# - 将图像上传到 azure blob 存储 - 在本地工作,部署时失败
- google-sheets - Google 表格中的日期格式 SQL 查询