【问题标题】:How to define a function of parent class using inheritance?如何使用继承定义父类的函数?
【发布时间】:2016-05-25 19:56:08
【问题描述】:

我已经公开了父类的成员函数。但我仍然收到错误

在“MotorBike”类中没有声明“void MotorBike::speeddown()”成员函数

speedupspeeddown。即使我已经公开继承了父类。

#include <iostream>
#include<string.h>
using namespace std;

class Bicycle
{
protected:
    int speed;
    char color[8];
public:
    Bicycle(int, char*);
    void speedup();
    void speeddown();
    void turnLeft();
    void turnRight();
};

class MotorBike:public Bicycle
{
private:
    int currentGear;
    int currentFuel;
public:
    MotorBike(int,char*,int,int);

};

Bicycle::Bicycle(int Speed,char* Color)
{
    speed=Speed;
    strcpy(color,Color);
    cout<<"The bike is now moving north!"<<endl;
}

MotorBike::MotorBike(int Speed,char* Color,int CurrentGear,int CurrentFuel): Bicycle(speed,color)
{
    speed=Speed;
    strcpy(color,Color);
    currentGear=CurrentGear;
    currentFuel=CurrentFuel;
    cout<<"The motorbike is now moving north!"<<endl;
}

void Bicycle::speedup()//error line
{
    cout<<"Speed is increased!"<<endl;
    speed+=1;
}

void Bicycle::speeddown()//error line
{
    if(speed>1)
    {
        cout<<"Speed is decreased!"<<endl;
        speed-=1;
    }
    else
        cout<<"The bike is already at rest!"<<endl;

}

void MotorBike::speedup()//error line
{
    if(currentGear==4)
        cout<<"You are already at maximum speed!"<<endl;
    else
    {
        switch(currentGear)
        {
        case 0:
            currentGear=1;
            currentFuel-=0.01;
            speed+=0.25;
            break;
        case 1:
            currentGear=2;
            currentFuel-=0.02;
            speed+=0.5;
            break;
        case 2:
            currentGear=3;
            currentFuel-=0.03;
            speed+=0.75;
            break;
        case 3:
            currentGear=4;
            currentFuel-=0.04;
            speed+=1;
            break;

        }
    }
}

void MotorBike::speeddown()//error line
{
    if(speed==1||speed>1)
    speed-=1;
    else
        cout<<"You are already at minimum speed!"<<endl;
}

int main()
{
    Bicycle B1(0,"Black");
    MotorBike MB1(0,"Black",0,100);
}

【问题讨论】:

    标签: c++ class inheritance


    【解决方案1】:

    您的MotorBike 没有函数speedup 也没有speeddown。如果你想,你必须在MotorBike 类中声明它,比如

    class MotorBike:public Bicycle
    {
    private:
        int currentGear;
        int currentFuel;
    public:
        MotorBike(int,char*,int,int);
        void speedup();
        void speeddown();
    };
    

    【讨论】:

    • 但我的自行车有它们,而且我从自行车继承了它们。
    • @AhmadShafique,是的 - 但您也已经继承了定义。如果您想为后代类提供不同的定义,您需要覆盖它们。
    • 继承它们意味着您获得了原始实现。您要做的是覆盖它们,在这种情况下,您必须在类定义中声明此意图,正如@SergeyA 所说。
    • @AhmadShafique,当您使用它时,请考虑使用 override 关键字。
    • @SergeyA 这不只适用于virtual 函数吗?
    【解决方案2】:

    我只是从上到下讨论这个:

    将已弃用的#include &lt;string.h&gt; 更改为#include &lt;string&gt;

    你的 Bicycle 有没有定义的函数,如果有东西试图调用它们,它将产生 LNK2019(未解析的外部)。要么定义它们,要么删除它们,或者使 Bicycle 成为一个抽象类。自行车也有孩子,所以给它一个虚拟析构函数。

    Bicycle(int, char*);
    virtual ~Bicycle() = default;
    virtual void speedup();
    virtual void speeddown();
    virtual void turnLeft();
    virtual void turnRight();
    

    您正在定义属于 MotorBike 成员的函数,但您从未声明它们。将它们添加到 MotorBike 的声明中:

    class MotorBike:public Bicycle
    {
    private:
        int currentGear;
        int currentFuel;
    public:
        Motorbike(int,char*,int,int);
        void speedup();
        void speeddown();
    };
    

    在 MotorBike 中覆盖 Bicycle 功能时使用 override 关键字:

    class MotorBike:public Bicycle
    {
    private:
        int currentGear;
        int currentFuel;
    public:
        Motorbike(int,char*,int,int);
        void speedup() override;  // like this
        void speeddown() override;  // and this
    };
    

    或者,或者,使用 Bicycle 在 MotorBike 中实现的任何默认功能:

    class MotorBike:public Bicycle
    {
    private:
        int currentGear;
        int currentFuel;
    public:
        Motorbike(int,char*,int,int);
        using Bicycle::speedup;  // like this
        using Bicycle::speeddown;  // and this
    };
    

    修正您的数据类型。 MotorBike 将 currentGearcurrentFuel 声明为整数,但在 MotorBike::speedup 中,例如,您正在向它们添加浮点值。这不起作用,因为这些值的小数部分将被截断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      相关资源
      最近更新 更多