【问题标题】:C++ out-of-line definition Pure Virtual MethodC++ 行外定义纯虚方法
【发布时间】:2016-06-23 21:32:00
【问题描述】:

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

我遇到的问题是:

错误:“getSafetyRating”的离线定义与“vehicle::Car”中的任何声明都不匹配 int Car::getSafetyRating()

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

车辆.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

汽车.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

汽车.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)的Car类中声明一个getSafetyRating方法:int getSafetyRating();
  • 99% 的代码与错误消息没有任何关系。学习如何删除不相关的东西;这对查找错误很有帮助。

标签: c++ qt inheritance virtual


【解决方案1】:

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

应该解决此问题的一件事是将其添加到 Motor Vehicle: 虚拟 int getSafetyRating() = 0;

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

【讨论】:

  • 感谢 Pms 的解释。修复了那个错误:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2011-09-08
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多