c++ - cplusplus




多态性和指向数组 (2)

这个问题在这里已经有了答案:

我有一个A类:

class A
{
    public:
        virtual double getValue() = 0;
}

而B类:

class B : public A
{
    public:
        virtual double getValue() { return 0.0; }
}

然后在main()中我做到:

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

一切都编译好,但似乎有可能是我的多态性有问题吗? 我感到困惑。


多元主义没有问题,但与你处理记忆的方式。 []运算符将在第一种情况下通过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#)







pointers