多态性和指向数组的指针

7 c++ arrays polymorphism pointers

我有一个A类:

class A
{
    public:
        virtual double getValue() = 0;
}
Run Code Online (Sandbox Code Playgroud)

和B级:

class B : public A
{
    public:
        virtual double getValue() { return 0.0; }
}
Run Code Online (Sandbox Code Playgroud)

然后在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
Run Code Online (Sandbox Code Playgroud)

如果相反,我做:

B * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //Everything else works fine too
Run Code Online (Sandbox Code Playgroud)

一切都很好,但好像我的多态性似乎有些不对劲?我很困惑.

CB *_*ley 12

您不能以多态方式处理数组,因此在new B[100]创建B对象数组并返回指向数组的指针时 - 或者等效地指向数组的第一个元素 - 并且将此指针指定给指向基类的指针是有效的,将此视为指向A对象数组的指针无效.

您不能的主要原因是(通常)派生对象与其基类的大小不同,因此尝试以基类对象数组的形式访问数组将不会使用正确的偏移量来获取指向下一个对象的指针派生类数组的下一个成员的基类子对象.


小智 5

多态性没有问题,但是你处理内存的方式.[]运算符将通过第一种情况下的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
Run Code Online (Sandbox Code Playgroud)