c++ 使用子类对象初始化的多态基类对象的数组

对不起复杂的标题.我有这样的事情:

class Base
{
public:
  int SomeMember;
  Base() : SomeMember(42) {}
  virtual int Get() { return SomeMember; }
};

class ChildA : public Base
{
public:
  virtual int Get() { return SomeMember*2; }
};

class ChildB : public Base
{
public:
  virtual int Get() { return SomeMember/2; }
};

class ChildC : public Base
{
public:
  virtual int Get() { return SomeMember+2; }
};

Base ar[] = { ChildA(), ChildB(), ChildC() };

for (int i=0; i<sizeof(ar)/sizeof(Base); i++)
{
  Base* ptr = &ar[i];
  printf("El %i: %i\n", i, ptr->Get());
}

哪个输出:

El 0: 42
El 1: 42
El 2: 42

这是正确的行为(在VC 2005中)?说实话,我希望这段代码不要编译,但确实如此,但它并没有给我我需要的结果.这是可能吗?

是的,这是正确的行为.原因是

Base ar[] = { ChildA(), ChildB(), ChildC() };

通过将三个不同类的对象复制到类Base的对象上并生成类Base的对象来初始化数组元素,因此您可以从数组的每个元素中观察类Base的行为.

如果要存储不同类的对象,则必须使用new和store指针来分配它们.

https://stackoverflow.com/questions/7203590/array-of-polymorphic-base-class-objects-initialized-with-child-class-objects

转载注明原文:c++ 使用子类对象初始化的多态基类对象的数组