【问题标题】:C++ Overriding method not workingC ++覆盖方法不起作用
【发布时间】:2014-12-04 19:09:58
【问题描述】:

我期待“我的游戏”打印出来,但我得到的是“基础” 只有在类内部使用方法时才会发生这种情况。

#include <iostream>

namespace Monster { class App {
public:
  App(){}
  ~App(){}
  void run(){
    this->speak();
  }
  void speak(){
    std::cout << "Base" << "\n";
  };
};}; // class / namespace

class MyGame : public Monster::App {
public:
  MyGame(){}
  ~MyGame(){}
  void speak(){
    std::cout << "My Game" << "\n";
  };
};

int main(){
  MyGame *child = new MyGame;
  child->run();
  return 0;
}

【问题讨论】:

  • 然后将speak 变成virtual 函数
  • 是的,做到了。显然需要阅读更多关于 C++ 的内容
  • 还阅读了新的 C++11 关键字“覆盖”。非常有用。

标签: c++ class inheritance methods


【解决方案1】:

在 C++ 中,您需要专门声明一个函数为 virtual

class BaseClass {
    virtual void speak () {
        ...
    }
};

【讨论】:

    【解决方案2】:

    在 C++ 中,只有标记为 virtual 的方法才能被覆盖。您可以将virtual 视为“可覆盖”的同义词。

    virtual 关键字必须出现在基类中。它也可以可选地出现在覆盖点的子类中,但不是必须的。

    如果您使用的是支持 C++11 的编译器(如果您正在学习 C++,则应该这样做),我建议您在要覆盖时始终使用新的 override 关键字:

    class Base {
    public:
        virtual void speak() {
            std::cout << "Base";
        }
    };
    
    class Derived : public Base {
    public:
        void speak() override {  // <---
            std::cout << "Derived";
        }
    };
    

    如果该方法实际上不是一个覆盖,编译器会通过给出一个错误来告诉你。

    第一次阅读时,方法是否是覆盖并不总是很明显。例如,由于返回类型协方差,以下是正确的:

    class A {};
    class B : public A {};
    
    class Base {
    public:
        virtual A* foo() {
            return nullptr;
        }
    };
    
    class Derived : public Base {
    public:
        B* foo() override {
            return nullptr;
        }
    };
    

    这可能不是很常用,但override 会明确说明以防有人必须阅读它。

    另外,如果你的类中至少有一个虚方法,也要把它的析构函数设为虚方法。这将确保所有析构函数在需要时运行,并且事情得到正确清理:

    class App {
    public:
        App() {}
        virtual ~App() {}  // <---
        void run() {
            this->speak();
        }
        virtual void speak() {
            std::cout << "Base\n";
        };
    };
    

    【讨论】:

    • 此外,从技术上讲,override 不是关键字,而是上下文标识符,但这不是重点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多