在我的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;
}
它汇编得很好,但是当我跑步时,它说的是
纯虚方法称为
在没有活动异常的情况下终止被叫
中止
谁能告诉我哪里错了?
谢谢。
答案 0 :(得分:3)
</Telepathy mode:on>
代码中的某处(显然没有发布)你从构造函数或析构函数中调用了虚函数。这个函数碰巧在类中是 pure virtual,你从中调用了构造函数/析构函数。
你有pure virtual call
因为在那个时间点,完整的子对象要么尚未完全构建,要么已经被破坏。并且用完整的子对象摧毁了它的虚函数表。所以你从抽象类中留下了虚函数表,并通过这个表调用了 pure 虚函数。
答案 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;
}
我做的唯一两件事是:
答案 2 :(得分:0)
您有两个AC *ac;
个实例
一个在AF.h中定义的AF类,另一个在AF.cpp中具有全局范围。
您发布的代码并不完全是导致该问题的代码,因此很难告诉您更多。
答案 3 :(得分:0)
背景:构造C ++对象时,首先构造基类,然后依次构造每个中间类,完成具体类。构建每个层时,它只能访问自身或超类已定义的虚函数。当对象被破坏时会发生相同的机制,尽管是相反的。
如果构造函数/析构函数调用仅由子类定义的虚函数,则会触发纯虚函数错误,该函数将立即中止您的程序。