C++多重继承和虚拟类

C++ multiple inheritance and virtual class

本文关键字:虚拟 多重继承 C++      更新时间:2023-10-16

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

飞行汽车继承自汽车和飞机

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

车辆.h

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

车.H

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

飞机.h

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

主函数包括vehicles.h标头和ifndef..

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

我怀疑在类源文件中包含类标头可能不正确,因为继承的标头

已经包含在继承标头本身中,但是如果我不在此处包含它们,编译器将不会引用类原型。作为尝试,我将所有内容都封闭在ifndef..中,但没有积极的结果。

你应该使用包含守卫

#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中时,它们将被定义两次。

一般来说,您应该在所有标头周围设置标头保护装置,或等效项,例如 #pragma once 等。