C++ C++;具有多重继承的编译器句柄偏移?

C++ C++;具有多重继承的编译器句柄偏移?,c++,C++,请耐心听我说清楚我的问题。我想我想要理解的是这样的: class Base1 { public: int value { 5 }; }; class Base2 { /* fields */ }; class Derived1 : public Base1 { ... }; class Derived2 : public Base2, public Derived1 { ... }; 编译器如何解析这样代码的内存偏移量 void base1_action(Base1 *instance) {

请耐心听我说清楚我的问题。我想我想要理解的是这样的:

class Base1 { public: int value { 5 }; };
class Base2 { /* fields */ };

class Derived1 : public Base1 { ... };
class Derived2 : public Base2, public Derived1 { ... };
编译器如何解析这样代码的内存偏移量

void base1_action(Base1 *instance) { 
    cout << instance->value << endl;
}

void change_base(Base2* instance) {
    base1_action(reinterpret_cast<Base1*>(instance));
}

int main() {
    Base2* instance = new Derived2;
    change_base(instance);
}
void base1_操作(base1*实例){

cout value它认为,GCC/MinGW将这样做:

class Base1 { public: int value { 5 }; }
class Base2 { /* fields */ }
class Derived1 : public Base1 { ... }
class Derived2 : public Base2, public Derived1 { ... }


Derived2:
    Base2 fields
    Derived1:
        Base1 fields
        Derived1 fields
    Derived2 fields
base1\u操作(重新解释强制转换(实例));

“编译器如何知道如何重新计算对象的偏移量?”

没有。您正在使用
重新解释\u cast
,这意味着类似“这里有一种类型的位,现在将其视为另一种类型的位”。这里不涉及偏移量计算。换句话说,这是代码中的错误


如果您要编写
静态强制转换
动态强制转换
,编译器确实需要计算偏移量。因为它知道类型和类型的内存布局,所以可以轻松地添加或减去正确的偏移量。如果您要隐藏类型,例如在t之前将指针分配到
void*
static\u cast
它将无法应用正确的偏移量计算。

给定的示例代码将无法编译。请提供编译的代码。精灵魔法和一个实现定义的taco.Edited,现在应该编译。请注意
重新解释\u cast
这里是UB。它想要任何方式。但是一种方式的良好描述在.I d我不知道还有什么可以补充我的答案。如果OP知道字段的位置,他应该清楚地知道如何计算偏移量。如果你看函数签名,我想应该会更清楚我在问什么。啊,那么我想做什么(横向转换)编译器真的不可能确定。是这样吗?@sircodesalot我不知道侧向强制转换是什么意思。如果你使用正确的类型和正确的强制转换,编译器将做正确的事情。如果你不这样做,你很可能得不到正确的行为。换句话说,对于一些实现两个基的类型,直接强制转换从一个基直接到另一个基-这是不允许的?@sircodesalot
reinterpret\u cast
将忽略偏移量,只复制位。这是一种强制转换,但它做的事情不对。
static\u cast
dynamic\u cast
将拒绝工作,因为所显示的基之间没有关系。如果启用如果你尝试在不相关的类型之间进行强制转换,“安全”强制转换将被拒绝。明白了,这回答了我的问题。谢谢!