如何在c++中扩展和使用超类的成员
How to extend and use members of a superclass in c++?
我正试图编写一个类来处理操纵杆输入(无关),并且在继承和新c++上生锈,我在尝试创建我的操纵杆类的子类时遇到了一些混乱。这是我的代码
//superclass's .h
#ifndef JOYSTICKINPUT_H
#define JOYSTICKINPUT_H
#include "WPILib.h"
class JoystickInput {
public:
JoystickInput(Joystick*);
Joystick * joystick;
Victor * myVictor [3];
bool buttons [10];
bool buttonClicked(int id);
void testForActions();
};
#endif
它的定义是
//superclass's .cpp
#include "JoystickInput.h"
JoystickInput::JoystickInput(Joystick * joy) {
joystick = joy;
for (int x = 0; x < 10; x++) {
buttons[x] = false;
}
}
bool JoystickInput::buttonClicked(int id) {
if (buttons[id] == false and joystick->GetRawButton(id) == true) {
buttons[id] = true;
return true;
} else if (buttons[id] == true and joystick->GetRawButton(id) == false) {
buttons[id] = false;
return false;
} else {
return false;
}
}
void JoystickInput::testForActions() {
}
现在我试图用一个JoystickOne类来扩展这个,因为它的行为略有不同。为此,我创建了一个joysticone .h和一个joysticone .cpp
//Joystickone.h
#ifndef JOYSTICKONE_H
#define JOYSTICKONE_H
#include "WPILib.h"
#include "JoystickInput.h"
class JoystickOne : public JoystickInput {
public:
JoystickOne(Joystick*);
Joystick * joystick;
Victor * myVictor;
bool buttons [10];
bool buttonClicked(int id);
void testForActions();
};
#endif
和。cpp
#include "JoystickOne.h"
#include "WPILib.h"
JoystickOne::JoystickOne(Joystick * joy) : JoystickInput(joy) {
//joystick = joy;
//myVictor = new Victor(1);
/*for (int x = 0; x < 10; x++) {
buttons[x] = false;
}*/
}
bool JoystickOne::buttonClicked(int id) {
if (buttons[id] == false and joystick->GetRawButton(id) == true) {
buttons[id] = true;
return true;
} else if (buttons[id] == true and joystick->GetRawButton(id) == false) {
buttons[id] = false;
return false;
} else {
return false;
}
}
void JoystickOne::testForActions() {
if (buttonClicked(1)) {
}
if (buttonClicked(2)) {
}
if (buttonClicked(3)) {
//myVictor->Set(.3);
}
if (buttonClicked(4)) {
}
}
我的问题是,我不太确定什么是无关的在JoystickOne类。我来自Java,所以我习惯了能够扩展超类并自动使用它的所有方法和成员。我很困惑,因为c++分为。h和。cpp文件;从我的经验来看,我必须声明所有我想要使用的变量和方法,即使它们是超类的成员。我不认为我需要定义方法buttonClicked()两次,虽然我没有机器人,所以我现在不能测试它。
基本上,我在问我可以从JoystickOne类的定义中删去什么,以及如何做到这一点。如果你们中有人对c++中一些好的OOP实践有什么建议,请随时分享,或者甚至可以澄清我的一些java主义。谢谢!
你应该在基类中将可以被覆盖的方法标记为virtual
。要在派生类中重写它,只需在派生类中重新定义它。
的例子:
class Base{
public:
virtual void overrideThis() { std::cout << "Base" << std::end; }
void test() { std::cout << "Base::test()" << std::endl; }
};
class Derived : public Base{
public:
void overrideThis() { std::cout << "Derived" << std::endl; }
};
现在如果你实例化:
Derived d;
d.overrideThis(); // Will print 'Derived'
d.test(); // Will print 'Base::test()'
对于成员变量。在基类中定义的私有成员在派生类中不可用。另一方面,protected成员变量和public成员变量都是可访问的。
您需要使用virtual
关键字使您的函数可继承。此外,还可以声明像
buttonClicked(int id) = 0;
这相当于一个抽象方法。
你不需要重新定义变量,如果它们是公共的或受保护的,它们应该自动继承。还要注意,你应该始终将析构函数声明为virtual,否则继承的类将无法删除它们自己的内容。
不,你不必在继承/子类中重新声明这些属性,所以删除它们。通常将它们设为private(仅供父类使用)或protected(供父类和子类使用),而不是public。对于你的方法,只有当它们在子类中的行为不同时才"重新声明"它们(重写),并确保在父类中声明它们为虚的。试验很好……删除一些东西,添加大量的print语句,看看它的行为:)除了。h/。cpp之外,它与Java*并没有什么不同。
*在基本级别
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 如何根据构造函数参数使用超类类型初始化成员变量?
- 无法使用子类变量访问超类公共成员
- 子类是否也在 c++ 中继承私有数据成员?但通过超类的公共方法访问
- 在子类函数中访问超类友元的受保护数据成员
- 访问超类实例的受保护成员
- 成员初始值设定项"超类"不命名非静态数据成员或基类
- 给超类的非常量成员初始值?(C++)
- 成员是否继承自超类的超类
- 模板超类的静态成员定义
- 通过C++中的子类访问超类的受保护静态成员
- 有关隐藏超类成员的问题
- 覆盖超类成员
- 当两个超类具有具有相同名称但签名不同的成员函数时,不明确
- 访问超类类型成员对象的受保护成员 - 一个优雅的解决方案
- 模板化超类的受保护成员应该在子类中可见,但(有时)不可见
- 如何在c++中扩展和使用超类的成员
- c++超类为子类定义静态成员变量
- 超类的成员函数可以访问子类的成员功能吗?如何
- 如何从具有不同构造函数的超类访问子类的成员