2015-10-30 78 views
2

在這裏,我試圖做一個基類飛機的子類。在我的主代碼中,我還沒有嘗試使用任何一個構造函數,因爲我只是想確保我可以讓子類Fighter正常工作。沒有匹配函數調用基類

它給我確切的錯誤是

no matching function for call to 'Airplane:Airplane()' 

,並表示它涉及到在Fighter.cpp

Fighter::Fighter(int engi, int seat, string description) 

Fighter.cpp

#include "Fighter.h" 
Fighter::Fighter(int engin, int seat, string description) 
{ 
    fNumEngines = engi; 
    fNumSeats = seat; 
    rangeAndSpeedDesc = description; 
} 
這行代碼

Fighter.h

#include "Airplane.h" 

using namespace std; 

#ifndef FIGHTER_H_ 
#define FIGHTER_H_ 

class Fighter:public Airplane { 
private: 
    int fNumSeats; 
    int fNumEngines; 
    string rangeAndSpeedDesc; 
} 

Airplane.cpp

#include "Airplane.h" 

using namespace std; 
Airplane::Airplane(int engines, int seats) 
    { 
     numSeats = seats; 
     numEngines = engines; 
    } 

回答

7
Fighter::Fighter(int engines, int seats, string desc) 
{ 
    fNumEngines = engines; 
    fNumSeats = seats; 
    rangeSpeed = desc; 
} 

相當於:

Fighter::Fighter(int engines, int seats, string desc) : Airplane() 
{ 
    fNumEngines = engines; 
    fNumSeats = seats; 
    rangeSpeed = desc; 
} 

除非另一個構造用於基類對象是使用默認構造初始化初始化const中初始化列表中的基類履行者實施。

這就是編譯器無法編譯該函數的原因。

您需要:

  1. 添加默認構造函數Airplane,或
  2. 使用Airplane在初始化列表中的可用構造函數。

看着你的發佈的代碼,選項2將工作。

Fighter::Fighter(int engines, int seats, string desc) : 
     Airplane(engines, seats), rangeSpeed(desc) 
{ 
} 

建議進行清理

我不明白爲什麼你需要的成員fNumEnginesFighterfNumSeats。基類已經有成員來捕獲這些信息。我建議你應該刪除它們。

+0

我讓他們擺脫困惑,我明白爲什麼他們現在不需要!感謝您的幫助和額外的提示! – 4Percent

0

該錯誤包含您需要的信息。您尚未定義類Airplane的默認構造函數。當你構建子類Fighter在這個函數:

Fighter(int, int, string); 

會有構建基類的調用。在你實現你不顯式調用基類構造函數:

飛機::飛機(INT引擎,INT席)

而且你有沒有默認構造函數,所以什麼都要編譯器呢?它抱怨。

您wiether需要定義一個默認構造函數:在構造函數中

Airplane::Airplane() 

或者調用一個現有的構造函數中的戰鬥機:

Fighter::Fighter(int engines, int seats, string desc) : Airplane(engines, seats) 
0

當調用這個構造

Fighter::Fighter(int engines, int seats, string desc) 
{ 
    fNumEngines = engines; 
    fNumSeats = seats; 
    rangeSpeed = desc; 
} 

那麼它會調用默認的基類構造函數。但是類Airplane不具有默認的構造函數。它與參數

Airplane(int, int); 

所以你需要明確calll構造在構造Fighter

。例如MEM-初始化列表構造

Fighter::Fighter(int engines, int seats, string desc) : Airplane(engines, seats) 
{ 
    fNumEngines = engines; 
    fNumSeats = seats; 
    rangeSpeed = desc; 
} 

而且目前尚不清楚爲什麼基類的數據成員和派生類是重複的。