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 ++覆盖方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章
CrossGeolocator 的 GetPositionAsync 不起作用
django views.py 中的保存方法在模型中覆盖后不起作用,py
dismissViewControllerAnimated:completion: 方法替换在 Xcode4.6.1 上不起作用