在c++中获取一个类的指针,该类是另一个具有多重继承的类的一部分
Getting the pointer in C++ for a class that is part of another class with multiple inheritance
我有一些相互继承的类,但它们使用模板。我想要的是有效地获得一个指向基类的指针和/或引用,就好像它是依赖于模板的其他可能的派生类之一
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的数据成员和虚函数的额外负载。
然而,我现在想从派生(a1)中获得一个指针或引用,它实际上是派生(b1)类型的指针或引用。
我真正要求的是帮助做offsetof()的"好"方式,但使用继承,我可以得到offsetof() a2,我假设这是一个很好的指针派生(b1),因为b1是一个空白类。
我试图获得派生(a1)对象的指针,然后添加sizeof(a1),希望这将是正确的位置,但想知道是否有人有更好的方法的建议。
据我所知,您有例如指向派生
derived<a1>* instance = whatever();
a1* pointer = instance;
但是建议您显式地进行强制转换。因为该类总是安全的,可以在编译时解析,所以使用static_cast。
a1* pointer = static_cast<a1*>(instance);
执行摘要:指针算术是你不应该在遍历类层次结构时使用的。static_cast和dynamic_cast正是用于这个目的:当你试图做一些危险的事情时,它们会警告你或报错,并且通常比你拥有更多关于确切内存布局的知识。
编辑:你编辑了这个问题,说你想从派生
将类b1作为类a1的基类
如果你想做的只是为你的一些对象节省内存空间,那么模板可能不是最好的工具。
由于b1
是空的,derived<b1>
没有给a2
增加任何有用的东西,那么为什么不使用简单的继承class a1 : public a2
呢?您可以实例化a1
或a2
中的对象,这取决于您是否需要额外的数据,它们都可以被强制转换为a2
(例如,如果您想将它们存储在列表中)。
如果您没有使用模板,只是使用多重继承,假设d是派生类型的实例,但被引用为A1,您可以。
A1* a = new Derived();
Derived* d = (Derived*)a;
B2* b = d;
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 复制矩阵的一部分并粘贴到另一个矩阵C++上
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- 将一个平台的一部分分享为另一个平台,同时将其涂成另一个平台
- 使用 C++98 将矢量的一部分移动(而不是复制)到另一个矢量
- 为什么将FMTFLAG指定两次 - 作为枚举的一部分,而另一个实例为静态const变量
- C++将 2D 阵列的一部分复制到另一个 2D 阵列,性能
- C++将字符数组的一部分复制到另一个字符数组
- 如何在 c++ 中将一个向量的一部分复制到另一个向量
- 卡在测试'if':另一个代码的一部分
- 将内部类名声明为另一个声明的一部分
- Strchr不起作用,或者我需要一个替代方案来检查给定字符串中的任何字符是否是另一个字符串的一部分
- 将std::字符串的一部分复制到另一个未初始化的字符串
- 将字符串的一部分与 STDLB 中的另一个字符串进行比较
- 将其他程序用作另一个程序的一部分
- 提取字符串的一部分并将部分放入字符数组和另一个字符串变量C++
- 将数据的某一部分从contst char*数组复制到另一个const char*数组中
- 将一个char指针的一部分复制到另一个char指针
- 将字符串的一部分存储在另一个字符串中
- 当一个字符串包含另一个字符串的一部分时比较字符串