如何在c++中扩展和使用超类的成员

How to extend and use members of a superclass in c++?

本文关键字:超类 成员 扩展 c++      更新时间:2023-10-16

我正试图编写一个类来处理操纵杆输入(无关),并且在继承和新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*并没有什么不同。

*在基本级别