我想知道 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/