C++ 通过指向所述类的抽象父级的指针执行该类的成员函数
我创建了一个抽象基类C++ 通过指向所述类的抽象父级的指针执行该类的成员函数,c++,pointers,abstract-class,access-violation,C++,Pointers,Abstract Class,Access Violation,我创建了一个抽象基类Animal,它具有公共虚拟抽象方法makeSound()。我创建了一个子类Cow,它实现了Animal.makeSound(),正如您所期望的那样(您知道……“moo”)。我有一个Farm类,它包含一个私有成员变量std::vector animals。在农场方法中,我迭代了所有动物,让它们发出声音 for(unsigned int i = 0; i < animals.size(); i++) { animals[i]->makeSound() } f
Animal
,它具有公共虚拟抽象方法makeSound()
。我创建了一个子类Cow
,它实现了Animal.makeSound()
,正如您所期望的那样(您知道……“moo”)。我有一个Farm
类,它包含一个私有成员变量std::vector animals
。在农场
方法中,我迭代了所有动物,让它们发出声音
for(unsigned int i = 0; i < animals.size(); i++)
{
animals[i]->makeSound()
}
for(无符号int i=0;imakeSound()
}
不幸的是,我犯了一个错误
中0x65766974处的未处理异常
TestBed.exe:0xC0000005:Access
读取位置0x65766974时发生冲突
知道这是怎么回事吗
更新:为每个请求添加更多代码
class Farm
{
public:
Farm();
virtual ~Farm(void);
void setBarnOnFire();
private:
vector<Animal*> animals;
};
Farm::Farm()
{
animals.push_back(new Dog());
animals.push_back(new Cat());
animals.push_back(new Chicken());
animals.push_back(new Horse());
animals.push_back(new Cow());
}
Farm::setBarnOnFire()
{
for(unsigned int i = 0; i < animals.size(); i++)
{
animals[i]->makeSound()
}
}
类场
{
公众:
农场();
虚拟农场(void);
void setbannfire();
私人:
媒介动物;
};
农场::农场()
{
动物。推回(新狗);
动物。推回(新猫);
动物。推回(新鸡);
动物。推回(新马);
动物。推回(新牛);
}
农场::SetBarnFile()
{
for(无符号整数i=0;imakeSound()
}
}
我应该做些什么来初始化动物
。
决议:
所以你们都是对的。我正在访问我不拥有的内存。但我花了很长时间才找到它。这是因为对对象初始化是如何发生的误解。基本上,为了“初始化”一个成员变量,我实际上是用一个局部变量覆盖它。然后,我给我创造的所有动物提供了当地的食物。稍后,动物们会尝试调用局部变量,而局部变量已经不存在了。好的,让我猜一猜: “TestBed.exe中0x65766974处未处理的异常:0xC0000005:访问冲突读取位置0x65766974。” 代码指针似乎被发送到0x65766974(“0x65766974处异常”),但这不是一个有效的读取位置,更不用说代码了:(“访问冲突读取位置0x65766974”,注意,相同的数字) 那么vtable或vtable指针是否可能已损坏?
可能对象正在被字符串覆盖?当它存储在一个向量中时,可能是向量中的前一个对象的缓冲区(可能是字符数组?)溢出了某些内容,这会损坏下一个对象vtable指针?您正在尝试访问您不拥有的内存。它可能由许多问题引起。如果您发布其余的代码,我打赌我们可以帮助:-)。我不能像James一样在没有看到其余代码的情况下确定,但是异常消息中有一个红色标志:
0x65 76 69 74
是四个ASCII字母-e v I t
。很有可能您正试图使用字符串的内容作为指针。@Zack+1用于酷的侦查。现在,如果拼写“邪恶”,那就太可怕了。正在检查…异常发生时调试器在哪里中断?你发布了那个代码吗?甚至更多的代码plz,特别是动物的去宽容,以及函数的覆盖版本的去宽容和主体