如何解决为什么从模板类继承 C++ 类,同时从抽象类继承 C++ 类会导致类成员重复?
我有以下 C++ 代码
配置.h
#include <cstdint>
typedef struct
{
uint8_t id;
uint32_t data;
} Config;
Handler.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() {}
main.cpp
int main(int argc,char** argv) {
A a;
return 0;
}
如果我已经逐步完成调试器中的代码,我注意到每当我在 a
中创建 A
类的 main
实例时,a
实例包含 cfg
结构的两个实例。这是我的调试器的输出(我一直在使用 GDB 以及 Netbeans IDE v8.2 下的 g++ 编译器(v 4.6.3)。在 Windows 10 Pro 下)
EDIT_01:
我发现我只能将值存储到 cfg
实例之一中。赋值到struct items之后
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
结构的实例,以防 A
类仅从 Handler
继承。请有人告诉我这种行为的原因是什么?有什么办法可以避免这种重复的班级成员吗?提前致谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。