gpt4 book ai didi

c++ - 子类转换和指针地址更改

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:28 25 4
gpt4 key购买 nike

我在 C++ 中使用多重继承已有很长时间了,但直到今天才意识到这可能意味着在将它们作为子类之一引用时指针地址可能不同。

例如,如果我有:

  class ClassA{
public:
int x;
int y;
ClassA(){
cout << "ClassA : " << (unsigned int)this << endl;
}
};

class ClassC{
public:
int cc;
int xx;
ClassC(){
cout << "ClassC : " << (unsigned int)this << endl;
}
};

class ClassB : public ClassC, public ClassA{
public:
int z;
int v;
ClassB(){
cout << "ClassB : " << (unsigned int)this << endl;
}
};


int main(){

ClassB * b = new ClassB();

}

在构造函数上打印时,A 类和 C 类具有不同的地址。

然而,当我尝试将它们相互转换回对方时,它会自动运行:

ClassA * the_a = (ClassA*)b;
cout << "The A, casted : " << (unsigned int)the_a << endl;

ClassB * the_b = (ClassB*)the_a;
cout << "The B, casted back : " << (unsigned int)the_b << endl;

我想这种信息可以由编译器从代码中派生出来,但是假设这适用于所有编译器是否安全?

附加问题:是否可以强制子类位置的顺序?例如,如果我需要首先定位 classA(本质上,共享相同的指针位置)作为它的子类的 ClassC,我是否只需要将它放在子类声明中的第一位?更新 好的,看来无法强制执行命令。是否仍然有可能在父类(super class)级别找到结构的“根”地址,即分配给子类的地址的开始?例如从ClassA获取classB的地址。

最佳答案

这是多重继承的完美标准用法,它适用于任何兼容的编译器。但是,您应该注意,在第一种情况下,显式转换是不必要的,而在第二种情况下,“C 风格转换”可以替换为 static_cast

Is it possible to force the order in which the subclass locations go.

否:布局是实现定义的,您的代码不应依赖于此顺序。

关于c++ - 子类转换和指针地址更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4580189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com