如何使用继承定义父类的函数?
Posted
技术标签:
【中文标题】如何使用继承定义父类的函数?【英文标题】:How to define a function of parent class using inheritance? 【发布时间】:2016-05-25 19:56:08 【问题描述】:我已经公开了父类的成员函数。但我仍然收到错误
在“MotorBike”类中没有声明“void MotorBike::speeddown()”成员函数
speedup
和 speeddown
。即使我已经公开继承了父类。
#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);
【问题讨论】:
【参考方案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 <string.h>
更改为#include <string>
。
你的 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 将 currentGear
和 currentFuel
声明为整数,但在 MotorBike::speedup
中,例如,您正在向它们添加浮点值。这不起作用,因为这些值的小数部分将被截断。
【讨论】:
以上是关于如何使用继承定义父类的函数?的主要内容,如果未能解决你的问题,请参考以下文章
java 既然子类能继承父类的所有属性与方法,那子类不能不定义成员变量?