c++ - 在 C++ 中获取属于另一个具有多重继承的类的类的指针

标签 c++ templates pointers multiple-inheritance template-meta-programming

我有一些相互继承的类,但它们使用模板继承。我想要的是有效地获取一个指针和/或对其中一个基类的引用,就好像它是依赖于模板的其他可能的派生类之一

class a1
{
public:
   int a;
   virtual void func()
   {
   }
   // other non virtual functions ...
};

class b1
{
public:
    //no members or virtual functions
    //other non virtual functions ...
};

class a2
{
public:
   int a;
   // ...
};

template < class T1 >
class derived : public T1,
                public a2
{
    int a;
    // ...
};

派生类可以从类 a1 或类 b1 继承,这主要是为了在派生中节省空间,因为 b1 是一个空白类,因此当派生类使用模板参数 b1 实例化时,它不会承载数据成员的额外负载和 a1 的虚函数。

但是我现在想从 derived(a1) 获取指针或引用,它实际上是类型 derived(b1) 的指针或引用。

我真正想要的是关于执行 offsetof() 的“好”方法的帮助,但是使用继承我可以获得 offsetof() a2,我假设这是派生的(b1)的一个很好的指针,因为b1 是一个空白类。

我试图获取 derived(a1) 对象的指针,然后添加到 sizeof(a1) 上,希望这将是正确的位置,但想知道是否有其他人有更好的建议。

最佳答案

据我了解你,你有例如一个指向 derived 的指针,并且想要一个指向 a1 的指针。由于a1是derived的直接基类,可以通过直接隐式转换获得this指针:

derived<a1>* instance = whatever();
a1* pointer = instance;

然而,建议您显式转换。由于此类始终是安全的并且可以在编译时解析,因此请使用 static_cast。

a1* pointer = static_cast<a1*>(instance);

执行摘要:指针算术是你不应该为遍历类层次结构而做的事情。有 static_cast 和 dynamic_cast 可用于此目的:当您尝试做一些危险的事情时,它们会警告您或出错,并且通常比您拥有更多关于确切内存布局的知识。

编辑:您编辑了问题以表明您想要从派生 转换为派生。这不可能。 static_cast 和 dynamic_cast 不支持改变实例内存布局的操作。强烈建议不要使用任何指针算法,因为您不知道编译器如何在内存中安排实例的数据字段。

关于c++ - 在 C++ 中获取属于另一个具有多重继承的类的类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6877007/

相关文章:

c++ - 如何在 OpenCV 中用零填充矩阵?

c++ - 实现自己的 begin() 和 end()

c++ - 我怎样才能让这段代码输出字符串中的实际文本而不是内存地址?

C++ - 采用指针但接收 int 的方法

c++将指针传递给函数

c++ - C++ fmt::print 与 fmt::format_to 命名的技术背景?

c++ - 如何使用 GoogleMock 设置模拟服务器

c++ - Visual Studio 2017 c++ win32 控制台项目模板

css - Joomla 文章/列插入填充

c++ - C++ 中是否可以使用无状态访问者模式?