错误:调用纯虚方法

时间:2011-03-25 14:26:50

标签: c++

在我的AC.h文件中:

#ifndef _AC_H
#define _AC_H
class AC{
private:
    unsigned short PC;
public:
    AC():PC(0){}
    virtual ~AC(){}
    virtual void test()=0;
};
#endif

在我的R500.h文件中:

#ifndef _R500_H
#define _R500_H
#include <iostream>
#include "AC.h"
class R500:public AC{
private: int mCStatus;
public:
    R500():mCStatus(0){}
    virtual ~R500(){}
    void test();
};
#endif

在我的R500.cpp

#include <iostream>
#include "R500.h"
using namespace std;
void R500::test(){
    cout << "test called\n";
}

在我的AF.h文件中

#ifndef _AF_H
#define _AF_H
#include "AC.h"
class AF{
public: int status;
    AC *ac;
    AF():status(1){} // this is a constructer
    void menu();
    void run();
};
#endif

在我的AF.cpp文件中:

#include <iostream>
#include "R500.h"
#include "AF.h"
#include "AC.h"

using namespace std;
void AF::menu() {
    R500 r;
    ac = &r;
    run();
}

void AF::run() {
    ac->test();
}

在我的Main.cpp

#include <iostream>
#include "AF.h"
#include "R500.h"
#include "AC.h"

using namespace std;

int main(int args, char**argv){
    AF af;
    af.menu();
    return 0;
}

它汇编得很好,但是当我跑步时,它说的是 纯虚方法称为 在没有活动异常的情况下终止被叫 中止
谁能告诉我哪里错了? 谢谢。

4 个答案:

答案 0 :(得分:3)

</Telepathy mode:on>

代码中的某处(显然没有发布)你从构造函数或析构函数中调用了虚函数。这个函数碰巧在类中是 pure virtual,你从中调用了构造函数/析构函数。

你有pure virtual call因为在那个时间点,完整的子对象要么尚未完全构建,要么已经被破坏。并且用完整的子对象摧毁了它的虚函数表。所以你从抽象类中留下了虚函数表,并通过这个表调用了 pure 虚函数。

同时检查此链接:When my base class's constructor calls a virtual function on its this object, why doesn't my derived class's override of that virtual function get invoked?

答案 1 :(得分:1)

您的代码中可以改进几件事。

但是对于您的问题,此代码在Visual Studio 2008上编译并运行良好:

#include <iostream>
using namespace std;

class AC 
{
private:
    unsigned short PC;
public:
    AC():PC(0) {}
    virtual ~AC() {}
    virtual void test() = 0;
};

class R500 : public AC
{
private: 
    int mCStatus;
public:
    R500(): mCStatus(0) {}
    virtual ~R500() {}
    void test();
};

void R500::test()
{
    cout << "test called\n";
}

class AF
{
public: 
    int status;
    AC *ac;
    AF() : status(1) {} // You forgot to add a body to your constructor here "{}"
    void menu();
    void run();
};

void AF::menu() 
{
    R500 r;
    ac = &r;
    run();
}

void AF::run() 
{
    ac->test();
}

int main(int args, char** argv)
{
    AF af;
    af.menu();
    return 0;
}

我做的唯一两件事是:

  • 将一个正文添加到AF的构造函数
  • 删除全局变量ac

答案 2 :(得分:0)

您有两个AC *ac;个实例 一个在AF.h中定义的AF类,另一个在AF.cpp中具有全局范围。 您发布的代码并不完全是导致该问题的代码,因此很难告诉您更多。

答案 3 :(得分:0)

背景:构造C ++对象时,首先构造基类,然后依次构造每个中间类,完成具体类。构建每个层时,它只能访问自身或超类已定义的虚函数。当对象被破坏时会发生相同的机制,尽管是相反的。

如果构造函数/析构函数调用仅由子类定义的虚函数,则会触发纯虚函数错误,该函数将立即中止您的程序。