2011-03-25 59 views
-1

在我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; 
} 

它編譯良好,但是當我運行時,它說,所謂
純虛方法
終止所謂的無一個有效的例外
Aborted
有人可以告訴我我哪裏錯了嗎? 謝謝。

+0

發佈真實代碼。 – Erik 2011-03-25 14:32:58

+1

我很積極,幾天前我看到這個問題,其中有不同的非真實代碼,但現在我找不到它。 – 2011-03-25 14:35:07

+0

輸入錯誤,抱歉...我已經有AF():status(1){} //這是一個構造函數 – user676862 2011-03-25 14:46:26

回答

3

</Telepathy mode:on>

某處在你的代碼(你沒有張貼明顯地)從構造函數或析構函數你叫虛函數。這個函數碰巧是純粹的虛擬類在你調用它的構造函數/析構函數。

你有pure virtual call,因爲在那個時間點,完整的子對象要麼還沒有完全構造,要麼已經被銷燬。並且用完整的子對象銷燬了它的虛函數表。所以你只剩下你抽象類中的虛函數表,並且通過這個表你可以調用純粹的虛函數。

檢查也是這個鏈接: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?

+0

或他正在切片。或混合他的全球/成員/本地變量。 – Erik 2011-03-25 14:39:11

+0

我不相信編譯器會將切片傳遞給抽象類的子對象。 – 2011-03-25 14:42:21

+0

+1心靈感應模式。 :) – Xeo 2011-03-25 15:04:46

0

你的AC *ac; 之一的AF類AF.h定義的兩個實例,另一個在AF.cpp全局範圍。 您發佈的代碼不完全是導致問題的代碼,因此很難再告訴您更多信息。

+0

這是真正的代碼,和AF.cpp中的交流變量,這是一個打字錯誤,我很抱歉 – user676862 2011-03-25 14:52:05

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的構造
  • 取出全局變量交流
0

背景:當構造一個C++對象,你首先構造基類,然後是每個中間類,然後用具體類來完成。在構建每個圖層時,它只能訪問本身或超類定義的虛擬函數。當物體被摧毀時也會發生同樣的機制,儘管是相反的。

如果一個構造函數/析構函數調用僅由子類定義的虛擬功能,你會觸發稱爲錯誤純虛函數,這將立即中止程序。