C++ C++;多重继承与虚拟类

C++ C++;多重继承与虚拟类,c++,inheritance,C++,Inheritance,我正在尝试编写一个包含四个类的程序:车辆、汽车、飞机和飞行汽车 飞车继承自汽车和飞机,汽车和飞机都继承自汽车 车辆.h class vehicle { public: vehicle(); vehicle(char*, int, char*); virtual void setmodel(char*); //more functions.. ~vehicle(); protected: char* model; int speed;

我正在尝试编写一个包含四个类的程序:车辆、汽车、飞机和飞行汽车

飞车继承自汽车和飞机,汽车和飞机都继承自汽车

车辆.h

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

飞机

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

#include "car.h"
#include "airplane.h"
class flyingCar: public car, public airplane
{
public:
    flyingCar();
    flyingCar(char*, int, char*);
};
此外,每个类的源文件都包括相关的头文件(因此thart
vehicle.cpp
包括
vehicle.h
car.cpp
包括
car.h
等等)

主要功能包括
vehicles.h
标题和
ifndef..

编译时,我在car.h中重新定义车辆类时出错,但由于我已经使用了
virtual
,我不明白如何解决这个问题


我怀疑在类源文件中包含类头可能是不正确的,因为继承的头本身已经包含在继承头中,但是如果我不在这里包含它们,编译器将不会引用类原型。作为尝试,我将所有内容都包含在
ifndef..
中,但没有任何积极的结果。

您应该使用include-guards

#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
因为
car.h
framework.h
都使用
#include“vehicle.h”
,所以
vehicle
类将在
flyingCar.h
中包含各自的标题时定义两次


一般来说,您应该在所有的头、或等周围都有一个标记。

@CoryKramer那么代码将受到菱形继承问题的影响。看@Daniel你说得对@πάντα ῥεῖ 那更准确,谢谢。(如果你通过标准搜索很难找到这个问题),@maja好吧,如果你知道的话,更容易找到;-)。好的,这就是它们要去的地方(我试着把它们放在源文件中…)。我习惯于将它们放在主源文件中,但我猜这不是给定的(也不是最有效的方法)。谢谢
#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