C ++多重继承和虚拟类

时间:2015-06-17 16:30:50

标签: c++ inheritance

我试图编写一个包含四个类的程序:车辆,汽车,飞机和飞行汽车。

飞行汽车继承汽车和飞机,汽车和飞机均继承自车辆。

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.hcar.cpp包括car.h等等。)。< / p>

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

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

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

1 个答案:

答案 0 :(得分:4)

你应该使用包含警卫

#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.hairplane.h都使用了#include "vehicle.h"所以Vehicle类会在flyingCar.h中包含两个标题时定义两次。< / p>

一般来说,您应该在所有标题周围header guards,或equivalent such as #pragma once等。