c++ - 指向基类的指针总是 <= 指向派生类的指针吗?

标签 c++ inheritance casting

我想知道 C++ 标准是否保证 单一 继承使对象向上“增长”,即 class Base和一个 class Derived: public Base , 和一个指针 Derived* ptr , dynamic_cast<Base*>(ptr) 的结果将始终在数值上小于或等于 ptr .

最佳答案

没有。内存布局是实现细节。

也就是说,假设没有虚函数,我不知道有任何实际不这样做的实现。如果您在 Derived引入一个虚函数(但在 Base 中没有),虚表指针可以 (取决于实现)放在 Base 字段之前(使 Base* 大于 Derived*)。

澄清:

上面的示例是特定于 Visual C++ 的。您可以使用以下代码查看它:

class Base {
    int X;
};

class Derived : public Base {
    virtual void f() {
    }
    int Y;
};

int main() {

    Derived d;
    Derived* d_ptr = &d;
    Base* b_ptr = dynamic_cast<Base*>(d_ptr); // static_cast would be enough BTW.

    bool base_smaller_or_equal = (ptrdiff_t)b_ptr <= (ptrdiff_t)d_ptr;

    return 0;

}

base_smaller_or_equal 在 Visual C++ 下将为 false。从@enobayram 的评论来看,在 GCC 下应该是 true

无论如何,它是一个实现细节,不可依赖。

关于c++ - 指向基类的指针总是 <= 指向派生类的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10062299/

相关文章:

C++从文本文件中删除尾随的新行

c++ - lib OSMesa 屏幕外上下文创建在 C++ 中失败,但仅在静态链接时

c++ - C++ 中的邻接矩阵

c++ - 它是功能继承还是其他什么?

c++ - GCC 有内置的编译时断言吗?

c++ - 派生类不能访问基类的 protected 方法

c++ - 通过抽象类将参数传递给祖父类的构造函数

c++ - 何时使用 reinterpret_cast?

c++ - (void *)1 是什么意思?

java - 具有泛型优势的多值类型映射