2015-06-17 4 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*); 
}; 

Кроме того, исходные файлы для каждого класса включают связанные заголовочные файлы (поэтому thart 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

Вы должны использовать, включают защитные

#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 и airplane.h использование #include "vehicle.h" поэтому Vehicle класс будет определен дважды, когда оба соответствующих заголовков включены в flyingCar.h.

В общем, вы должны иметь header guards вокруг всех ваших заголовков или equivalent such as #pragma once и т.д.

+0

Хорошо, так вот куда они идут (я попытался поместить их в исходные файлы ..). Я привык размещать их в основном исходном файле, но я думаю, что это не настоящий (и не самый эффективный способ). Благодарю. – maja

Смежные вопросы