cpp/arduino: 类调用继承虚方法

cpp/arduino: classes call inherited virtual method

我正在努力在互联网上找到以下问题的正确答案。 我不是本地 C++ 程序员,对 PHP、Pascal 和 JavaScript 中的 OOP 编程有更多了解,但我可以管理。

我想创建一个 class 层次结构来处理一些任务,例如在 LCD 屏幕上显示内容。

看起来像下面的classes:

class base {
  public:
    base() { };
    virtual void display() { // Need to be called first from all child objects };
    virtual bool keyPress(int state) { //Need to be called first from all child objects };
};

class child : public base {
  public:
    child():base() {};
    virtual void display() { 
       >> call base->display() 
       // do some stuff
    };
    virtual bool keyPress(int state) { 
       >> call base->keyPress(state) 
       // check some stuff
    };
};

我所知道的大多数程序语言都有一些 'parent::' 调用继承的虚方法的解决方案,但我找不到任何可与 C++ 相媲美的东西。

我现在要使用的一个选项是:

class base {
  protected:
    virtual void _display() =0;
    virtual bool _keyPress(int state) =0;
  public:
    base() { };
    void display() { 
        // do basic stuff
        _display();
    };
    bool keyPress(int state) { 
      if (!_keyPress(state)) {
        // do basic stuff.
   };
};

class child : public base {
  protected:
    virtual void _display() { 
       // do some stuff
    };
    virtual bool _keyPress(int state) { 
       // check some stuff
    };
  public:
    child():base() {};
};

我不喜欢这种方法,但它会起作用。

正确的语法是base::display():

class base {
  public:
    base() { };
    virtual void display() { /* Need to be called first from all child objects*/ };
    virtual bool keyPress(int state) { /*Need to be called first from all child objects*/ return 42; };
};

class child : public base {
  public:
    child():base() {};
    virtual void display() { 
       base::display();
       // do some stuff
    };
    virtual bool keyPress(int state) { 
       return base::keyPress(state);
       // check some stuff
    };
};

但是,如果它在所有子 类 中都相同,您最好让 base 像在第二个代码中那样调用它的方法。不清楚您为什么“不喜欢这种方法”。它可以工作,做你想做的事,避免大量重复代码并减少派生 类 中出错的机会。请注意,虚拟方法不必是 protected,因为派生的 类 不应该直接调用它们,您可以将它们设为 private: https://godbolt.org/z/1qjooKq85(也许是你不喜欢什么?)。