2015-06-17 135 views
-1

我正在嘗試編寫一個四類課程:車輛,汽車,飛機和飛行汽車。C++多重繼承和虛擬類

飛行汽車繼承汽車和飛機,汽車和飛機都從車輛繼承。

vehicle.h

class vehicle 
{ 
public: 
    vehicle(); 
    vehicle(char*, int, char*); 
    virtual void setmodel(char*); 
    //more functions.. 
    ~vehicle(); 
protected: 
    char* model; 
    int speed; 
    char* color; 
}; 

car.h

#include "vehicle.h" 
class car:public virtual vehicle 
{ 
public: 
    car(); 
    car(char*, int, char*); 
    void driving(std::ostream&); 
}; 

airplane.h

#include "vehicle.h" 
class airplane:public virtual vehicle 
{ 
public: 
    airplane(); 
    airplane(char*, int, char*); 
    void flying(std::ostream&); 
}; 

flyingCar.h

#include "car.h" 
#include "airplane.h" 
class flyingCar: public car, public airplane 
{ 
public: 
    flyingCar(); 
    flyingCar(char*, int, char*); 
}; 

另外,每個類的源文件都包含相關的頭文件(因此,vehicle.cpp包括vehicle.h,car.cpp包括car.h等等..)。

主要功能包括vehicles.h標題和ifndef..

當我編譯我car.h中重新定義類車輛時出現錯誤,但因爲我已經使用了virtual我不明白我怎麼能解決這個問題。

我懷疑在類源文件中包含類頭文件可能不正確,因爲繼承頭文件已包含在繼承頭文件本身中,但如果我不在這裏包含它們,編譯器將不會引用類原型。作爲一個嘗試,我把所有內容都包含在ifndef..中,但沒有任何結果。

+1

@CoryKramer然後代碼會受到菱形繼承問題。見http://www.cprogramming.com/tutorial/virtual_inheritance.html – Daniel

+0

@丹尼爾你是對的! – CoryKramer

+0

@πάνταῥεῖ更準確,謝謝。 (如果你正在尋找標準搜索,仍然很難找到這個問題), – maja

回答

4

您應該使用包括因爲無論car.hairplane.h使用#include "vehicle.h"所以Vehicle類將當兩個各自的頭都包含在flyingCar.h定義兩次衛士

#ifndef VEHICLE_H 
#define VEHICLE_H 

class vehicle 
{ 
public: 
    vehicle(); 
    vehicle(char*, int, char*); 
    virtual void setmodel(char*); 
    //more functions.. 
    ~vehicle(); 
protected: 
    char* model; 
    int speed; 
    char* color; 
}; 

#endif 

一般來說,你應該有header guards周圍所有的標題,或equivalent such as #pragma once

+0

好的,所以這就是他們去的地方(我試圖將它們放在源文件中。)。我習慣將它們放在主源文件中,但我想這不是給定的(也不是最有效的方式)。謝謝。 – maja