c++ - 多态性和指向数组的指针

标签 c++ arrays polymorphism pointers

<分区>

我有一个 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

一切都可以正常编译,但似乎我的多态性似乎有问题?我很困惑。

最佳答案

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

您不能这样做的主要原因是(通常)派生对象与其基类的大小不同,因此尝试将数组作为基类对象的数组进行访问将不会使用正确的偏移量来获取指针到派生类数组的下一个成员的下一个基类子对象。

关于c++ - 多态性和指向数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1411844/

相关文章:

c++ - 在一行的末尾插入一个字符串

c++ - c++中的popen等价物

c++ - 如何减少从一个 boost 链到另一个 boost 链的延迟

sql - DISTINCT 有两个 array_agg(或一个 array_agg 里面有元组)?

c++ - Qt、多重继承、包装器或事件过滤器

javascript从两级数组中提取id以获取新对象中的键值对

php - 解释一下,一个或多个数组php?

javascript - 流的信息丢失是否与这种多态性固有的结构子类型有关?

C++ - 虚拟运算符 = 从派生实例调用基类?

c++ - 具有不同返回类型的虚函数