首页 > 解决方案 > 为什么从模板类和抽象类继承 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类的实例时,maina实例都包含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. 请问谁能告诉我这种行为的原因是什么?有什么办法可以避免类成员的这种重复?提前致谢。

标签: c++templatesinheritanceabstract-class

解决方案


推荐阅读