C++ 外联定义纯虚方法

C++ out-of-line definition Pure Virtual Method

我有 4 个文件 car.cpp、car.h、motorvehicle.h 和 vehicle.h。我在QT-creator环境下编程。

我遇到的问题是:

错误:'getSafetyRating' 的外联定义与 'vehicle::Car' 中的任何声明都不匹配 整数 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;
}

car.h

中添加函数 int getSafetyRating() 的声明

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

应该解决这个问题的一件事是将其添加到机动车中: 虚拟 int getSafetyRating() = 0;

并在 car.h 中写入 虚拟 int getSafetyRating()