2015-06-17 106 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