这个C++代码是否可移植?

Sum*_*ant 2 c++ compiler-construction virtual portability

struct A {
  int a;
  virtual void print() {}
};

struct B : A {
  int b;
  virtual void print() {}
};

int main(void)
{
  A *a = new B;
  a[0].print(); // g++, vs2010, clang call B::print.
}
Run Code Online (Sandbox Code Playgroud)

所有三个g ++,vs2010,clang调用B :: print.几乎怀疑我的C++ 101.我的印象是使用带有对象的点不会导致动态调度.只有 - >带指针和带引号的点将导致动态调度.

所以我的问题是这段代码是否可移植?

Ker*_* SB 14

a[0]是一样的*a,并且表达是一个参考A,和虚拟调度发生通过引用只是因为它通过指针.a->print()(*a).print()完全相同.

  • 你可能想提一下`a [0]`实际上相当于`*(a + 0)`,它又与`(*a)`相同.这就是如何评估数组下标,假设没有发生运算符重载. (4认同)