Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过指向所述类的抽象父级的指针执行该类的成员函数_C++_Pointers_Abstract Class_Access Violation - Fatal编程技术网

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,特别是动物的去宽容,以及函数的覆盖版本的去宽容和主体