c++ - 假设派生类的指针与第一个基类的指针相同有多安全?

标签 c++ inheritance vtable

考虑以下程序:

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/

相关文章:

c++ - 奇怪的继承模式

c++ - 如何创建没有虚方法的基类的派生类?

c++ - 指向不同地址的虚表和函数指针

qt - Qt:信号和插槽错误:未定义对`vtable的引用

c++ - ELF文件中的虚拟表存放在哪个段,数据段还是其他?

c++ - 编写二进制 block 以 boost 存储为 json 的属性树

c++ - 我怎样才能得到一个程序的状态?

python - 访问子模板中声明的变量或 Controller 范围的变量

c++ - 标准头文件 <new> 中 std::nothrow 和 std::new_handler 的用途是什么

c++ - lua5.3 dll 文件中缺少名称