继承类使用继承的结构

时间:2019-09-03 16:43:39

标签: c++ inheritance struct c++14

我有一个抽象基类和一个空结构,应在此类内部使用

//base.hpp
class Base {
public:
    virtual void do_something(const char* arr) {
        h = reinterpret_cast<Header*>(arr); //What happens here in the derived class? I would want it to cast it to the respective derived struct
        h->val = 10 //these are some common functionalities which I want to include in the base class
    }

private:
    Header *h;
}
//header.hpp
struct Header {
}

class和struct都是继承的

//derivedA.h
class DerivedA : public Base {
...
//this class should refer to HeaderA

}
//header.hpp
struct HeaderA : public Header{
    int val;
    bool is_it;
}

类似地,还有另一个派生类DerivedB及其关联的HeaderB。 如何使派生类引用其各自的派生结构?

即使基本成员很少,我却拥有空的基本结构的原因之一是我正在使用reinterpret_cast。输入缓冲区中的公共成员的排列方式不同。但是在基类中定义通用功能很有用。我在这里想念什么?我该如何工作?

1 个答案:

答案 0 :(得分:1)

0)在char *上使用reinterpret_cast是一个非常糟糕的主意。更改您的基本构造函数以使用Header指针。或者不这样做,因为他们没有共享任何东西,没有真正的理由在这里使用继承。

为了清楚起见,也许您在基本Header中遗漏了很多东西,我不知道。但是按照书面规定,您不需要首先使用基本标头指针。

1)使HeaderA从Header继承。

2)DerivedA的构造函数采用HeaderA *参数,然后将其传递给基类的基于Header *的构造函数。

3)DerivedA使用正确的类型保留传入内容的单独副本。

类似

var file = new FileInfo(@"C:\Very.Large.Array.json");

using (var sr = new StreamReader(file.OpenRead()))
using (var reader = new JsonTextReader(sr))
{
  while (reader.Read())
  {
    if (reader.TokenType == JsonToken.StartObject)
    {
      var obj = JObject.Load(reader);      
      var rawJSON = obj.ToString();
    }
  }
}

请注意,此处完全不解决HeaderA的所有权。您可能想在基类中使用class Base { public: virtual ~Base() {} // virtual base destructor! Very important. Base(Header* foo) : header(foo) { } private: Header* header; ... }; // at the very least, you probably want a virtual destructor here too struct Header { virtual ~Header() {} }; struct HeaderA : public Header { ... }; class DerivedA : public Base { public: DerivedA(HeaderA* header) : : Base(header) , headerA(header) { ... } private: HeaderA* headerA; }; ,并让RAII在其他任何地方为您处理它……而不是像上面代码中那样使用引用。然后,即使标头完全为空,至少也要在基类中添加它。

返回从std::unique_ptr<Header>char*的转换。我想您正在使用Header*或类似的标题将其写到文件,数据包或类似文件中,以提高效率。

不要。

在我研究过的两个AAA MMORPG代码库中,每个结构的每个字段都被明确地写出(写到数据包或文件中)。在某些情况下,它可能像过于冗长的memcpy()一样工作,但是我们付出了努力,因为安全性值得额外努力。如果您继续按照自己的方式进行操作,则标头中的所有内容都必须正确存在。

  • 没有指针
  • 字符串必须是固定大小的数组,大多数情况下,大多数情况下这些数组都是空的,因为它们的大小适合最坏的情况。
      对象指针必须替换为对象ID,并且对象ID在写入和读取之间必须保持一致。而且这些ID必须存储在结构中,这意味着您每次使用它们时都要查找它们。
  • 您在撰写本文时被锁定为“大字节序”或“小字节序”,如果您撰写的“字节序”与阅读的“字节序”不同,那么天堂将为您提供帮助。 (“到底是什么大尾数的?到底是什么?”谷歌搜索。现在。认真。)

通过单独写出字段,您可以执行

之类的操作
  • 以特定的字节序写出所有内容。
  • 将对象指针转换为对象ID。
  • 写出长度,然后写出正确的字符/字节数,而不是固定/几乎为空的字节数。
  • 加密字段值(MMO无法信任不会被嗅探的数据包,因此玩家可以作弊)
  • 更改字段顺序(有趣的是,对数据包的字段顺序进行加扰并观看黑客在首次连接时崩溃,这时您知道需要标记哪些帐户以进行进一步调查。是的,这是为什么要这样做的原因之一您的某些客户端的旧版本将无法与相应服务器的新版本一起使用。)