C ++覆盖方法不起作用

Posted

技术标签:

【中文标题】C ++覆盖方法不起作用【英文标题】:C++ Overriding method not working 【发布时间】: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 关键字“覆盖”。非常有用。 【参考方案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 不是关键字,而是上下文标识符,但这不是重点。

以上是关于C ++覆盖方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Directory.Move不起作用(文件已存在)

为啥我的保存方法在管理员中不起作用?

继承的方法不会改变变量值

CrossGeolocator 的 GetPositionAsync 不起作用

django views.py 中的保存方法在模型中覆盖后不起作用,py

dismissViewControllerAnimated:completion: 方法替换在 Xcode4.6.1 上不起作用