gpt4 book ai didi

c++ - C++多态性中的访问冲突(指向错误位置的虚拟指针函数?)

转载 作者:搜寻专家 更新时间:2023-10-31 00:33:51 45 4
gpt4 key购买 nike

这越来越奇怪了。 Ship 继承自 Entity,MerchantShip 继承自 Ship,其他类型稍后添加,但基本思想和教授要求的是我使用多态性,以便我可以在主类的集合(指针在我的实现中将分配的内存用作数组),因此在后面的所有三个类中都有一个 virtual void 更新。事实上,我已经使用了所有可能有意义的虚函数和非虚函数的组合。代码:

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace std;


class Entity
{
public:
int x, y;
virtual void update() = 0;
void print()
{
cout << "x:" << x << ", y:" << y << endl;
}
};

class Ship: public Entity
{
public:
virtual void update()
{
Move();
}

void Move(){x++;};
};

class MerchantShip: public Ship
{
public:
void update()
{
DontMove();
}

void DontMove(){};
};

int main(int argc, char* argv[])
{
int EntityNumber = 2;
Entity* entities;
entities = (Entity*)malloc(EntityNumber*sizeof(Entity));
for (int i = 0; i < EntityNumber; i++)
{
entities[i].print();
entities[i].update();
entities[i].print();
cout << endl << "next ship: " << endl;
}
system("PAUSE");
return 0;
}

好的,所以它编译得很好(stdafx.h 只在 Visual Studio 中需要)但是我得到一个运行时错误,这是在它试图进入被覆盖的更新函数时在 0xffffffffffffffff 处的访问冲突。在调试信息中,它始终看起来像虚函数指针 (__vfptr) 清楚地指向它应该在的地方 (0xcdcdcdcdcdcdcdcd) 之外的其他地方,并且它始终是相同的位置,即使在另一个代码中我试图做同样的事情。

目前的研究:原因 #1(不适用):在调用前释放的 DLL 中使用函数原因#2(再次不适用):程序员忘记继承。我没有在任何具有相同问题的线程中遇到任何其他问题,并且我已经调试了几天。如果我删除覆盖它只会调用基类的函数。有什么线索吗?

最佳答案

您不应该使用malloc 来分配C++ 对象。 new 是正确的运算符。

您将无法实例化 Entity,因为它是一个抽象类。

您需要的是指向 Entity 的指针数组,并将它们关联到具体 Entity 的地址(ShipMerchantShip),像这样:

typedef Entity *PEntity;
PEntity entities[2];
entities[0] = new Ship();
entities[1] = new MerchantShip();

当您通过指针调用虚方法时,多态性将正确应用:

for (int i=0; i<2; i++) {
entities[i]->print();
entities[i]->update();
entities[i]->print();
}

真正重要的是理解这里没有Entity,只有特定的EntityEntity 只是一个概念; Ship(或MerchantShip)是其具体实现之一。您可以通过抽象接口(interface)操作具体对象。

关于c++ - C++多态性中的访问冲突(指向错误位置的虚拟指针函数?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27742470/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com