题
这个问题已经有一个答案在这里:
- 为什么这个代码崩溃的地方提到的? 7的答案
我有一个A类:
class A
{
public:
virtual double getValue() = 0;
}
和一B类:
class B : public A
{
public:
virtual double getValue() { return 0.0; }
}
然后在主要()我做的事:
A * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //This, or any other index besides 0, causes the program to quit
如果不是我做的:
B * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //Everything else works fine too
一切都汇编了现,但它好像有什么问题我的态性也许?我感到困惑。
解决方案
你不能这么对阵多态形式,这样的话 new B[100]
创建一个系列 B
目的和返回的一个指数或等价的第一个元件阵列,虽然它是有效的分配这一指针指向一个基类,这不是有效的把这作为指针到一系列的 A
对象。
主要原因,你可不是那些(通常)衍生的对象是一个大小不同,他们的基本类别,所以在试图访问阵列为一系列基类物体不会使用正确的偏得到一个指向下一个基类子对象的下一个成员得出类阵列。
其他提示
没有问题的polymrphism但是与你的方式处理存储器。在[]运营商将提前通过一系列由sizeof(A)字节在第一种情况下和sizeof(B)字节中的第二种情况。因为对象的类型B A*是不是指向正确的位置存储器。
这里是另一个角度来看待这件事
char * var;
var = (char*) new B[100];
std::cout << ((A*)var[0]).getValue(); //This works fine
std::cout << ((A*)var[1]).getValue(); //This will fail
std::cout << ((A*)var[sizeof(B)]).getValue(); // should work
你没有分配的对象中的阵列:
for (int i=0;i<100;i++)
var[i] = new B;
(虽然我可能会被混合起来C++和C#)
不隶属于 StackOverflow