C ++外联定义纯虚方法

时间:2016-03-09 13:20:42

标签: c++ qt inheritance virtual

我有4个文件car.cpp,car.h,motorvehicle.h和vehicle.h。我在QT创建者环境中编程。

我遇到的问题是:

错误:' getSafetyRating'的外线定义不符合“车辆::汽车”中的任何声明。 int Car :: getSafetyRating()

以下是程序文件供参考,我是学习c ++的新手,非常感谢帮助!干杯亚历克斯。如果有任何重新发布的问题我会提前道歉。

vehicle.h

#ifndef VEHICLE_H
#define VEHICLE_H

#include <string>

namespace vehicle
{
    class Vehicle
    {
    public:
        Vehicle(int numberOfPassengers,
            int topSpeed,
            int numberOfWheels,
            std::string color = "red");

        virtual ~Vehicle();

        virtual std::string getColor();

        virtual int getTopSpeed();

        virtual int getNumberOfWheels();

        virtual int getNumberOfPassengers();

        virtual int getSafetyRating() = 0;

    protected:
        int m_numberOfPassengers;
        int m_topSpeed;
        int m_numberOfWheels;
        std::string m_color;
    };
}

#endif // VEHICLE_H

motorvehicle.h

#ifndef MOTORVEHICLE_H
#define MOTORVEHICLE_H

#include "vehicle.h"

namespace vehicle
{
    class MotorVehicle : public Vehicle
    {
    public:
        MotorVehicle(int numberOfPassengers,
            int topSpeed,
            int numberOfWheels,
            double kilometresPerLitre);

        MotorVehicle(int numberOfPassengers,
            int topSpeed,
            int numberOfWheels,
            std::string color,
            double kilometresPerLitre);

        virtual ~MotorVehicle();

        virtual double getKilometresPerLitre();

    protected:
        double m_kmpl;
    };
}

#endif // MOTORVEHICLE_H

car.h

#ifndef CAR_H
#define CAR_H

#include "motorvehicle.h"

namespace vehicle
{
    class Car : public MotorVehicle
    {
    public:
        Car(int numberOfPassengers,
            int topSpeed,
            double kilometresPerLitre,
            int numberOfAirBags = 2,
            bool abs = true,
            int numberOfWheels = 4);

        Car(int numberOfPassengers,
            int topSpeed,
            double kilometresPerLitre,
            std::string color,
            int numberOfAirBags = 2,
            bool abs = true,
            int numberOfWheels = 4);

        virtual ~Car();

        virtual int getNumberOfAirBags();

        virtual bool hasAutomaticBreakingSystem();

    protected:
        int m_numberOfAirBags;
        int m_abs;
    };

}

#endif // CAR_H

car.cpp

#include "car.h"
using namespace vehicle;

Car::Car(int numberOfPassengers,
         int topSpeed,
         double kilometresPerLitre,
         int numberOfAirBags,
         bool abs,
         int numberOfWheels) :
    MotorVehicle(numberOfPassengers, topSpeed, numberOfWheels, kilometresPerLitre),
    m_numberOfAirBags(numberOfAirBags),
    m_abs(abs)
{

}
Car::Car(int numberOfPassengers,
         int topSpeed,
         double kilometresPerLitre,
         std::string color,
         int numberOfAirBags,
         bool abs,
         int numberOfWheels):
    MotorVehicle(numberOfPassengers, topSpeed, numberOfWheels,color, kilometresPerLitre),
    m_numberOfAirBags(numberOfAirBags),
    m_abs(abs)
{

}

Car::~Car()
{

}

int Car::getNumberOfAirBags()
{
    return m_numberOfAirBags;
}

bool Car::hasAutomaticBreakingSystem()
{
    return m_abs;
}

int Car::getSafetyRating()
{
    int SafetyRating = 0;
    if (m_numberOfAirBags >= 4)
    {
        SafetyRating += 3;
    }
    else if (m_numberOfAirBags >= 2)
    {
        SafetyRating += 2;
    }
    else if (m_numberOfAirBags > 0)
    {
        SafetyRating += 1;
    }

    if (m_abs)
    {
        SafetyRating += 2;
    }
    return SafetyRating;
}

2 个答案:

答案 0 :(得分:2)

您的汽车类没有在.h文件中声明的getSafetyRating,并且车辆中的纯虚拟功能需要它。当你声明一些纯虚拟的东西,即func()= 0时,你基本上说任何从它继承的类必须实现这个功能。 因此,机动车类和汽车类必须至少声明getSafetyRating功能。

应该解决这个问题的一点是将其添加到机动车: virtual int getSafetyRating()= 0;

并在car.h中写 virtual int getSafetyRating()

答案 1 :(得分:0)

int getSafetyRating()

中添加功能car.h的声明