C++中子类的数组不能用父类指针来表示
Contents
假设我们有一个父类A,一个子类B,如果我们创建一个B的数组,我们能这样用吗?
1 | A* barray = new B[10]; |
写段代码在Visual Studio中来试试吧:)
1 |
|
我们可以看到输出的结果是:
1 | size of A: 4 |
说明尽管我们创建时用的是new B,但是因为声明的是A*,所以被认为是一个A的数组,按照A的大小来操作,所以可以看到成员变量aa的值是不对的。而且最后析构的时候只调用了A的析构函数,说明这个数组在delete的时候也是有问题的。
如果我们把A的析构函数加上virtual,可以得到如下的结果:
1 | size of A: 8 |
说明只要我们加上virtual,在delete的时候编译器是知道怎么delete的。
但是这并不是C++标准中制定的,不同的编译器会有不同的结果,比如如果把带virtual的代码放在g++中,会得到如下的结果:
1 | size of A: 8 |
所以,C++中子类的数组不能用父类指针来表示。