考虑以下程序:

struct Base1 { void *x; virtual ~Base1() { } };
struct Base2 { void *x; virtual ~Base2() { } };

struct Derived : Base1, Base2 { };

int main()
{
    Derived d;
    return &d == static_cast<void *>(static_cast<Base1 *>(&d));
}
在我对Clang,GCC和Visual C++的所有测试中,返回值为1
我了解C++实际上并不能保证这一点。
但是,实际上是,可以信赖吗?
(假设没有虚拟继承。编辑:我假定多态基类。)
在什么现实情况下(如果有的话),派生类的指针在需要用作其,第一个(非虚拟,多态)基类的指针之前需要进行调整?

最佳答案

我可以想到一个原因,为什么编译器(或链接器,如果使用-flto)在理论上可能会打乱基类在类中的顺序。如果使用Base2而不是Base1,它可能会认为这是一个优化机会。
我认为这不可能,但是有可能。

关于c++ - 假设派生类的指针与第一个基类的指针相同有多安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63256737/

10-12 05:10