繁体   English   中英

从基础 class 内部调用非虚拟基础 class function 的覆盖(派生类)版本?

[英]Calling overriden (derived class) version of a non-virtual base class function from inside base class?

所以,如果我有

class base
{
  public:
  virtual void start();
  virtual void stop();

  void doSomething() { start(); .... stop(); }
}

class derived : public base
{
  public:
   void start();
   void stop();
}

调用derived.doSomething()将调用derived::start() 和derived::stop()。
但这仅在它们是虚拟的情况下才有效。

我想知道为什么没有virtual关键字就不能工作,这意味着较低级别的细节。 我在网上找不到太多关于这个的...

谢谢!

如果没有 virtual 关键字,base::doSomething 代码对这些方法的派生版本没有任何想法(想想 linker 分辨率)

如果 function 被声明为虚拟,则此 function 的所有覆盖都存储在虚拟成员 function 表 (vtable)中。 当在你的代码中调用这样的 function 时,程序实际上只是指向表的位置。 然后使用该表确定在运行时调用的正确 function。

如果 function 未声明为虚拟,则doSomething的基本 class 实现中的start()stop()始终只是指向这些函数的基本 class 定义。

C++ 允许您在两种机制之间进行选择,因为在 vtable 中的运行时查找会产生一些开销,而 C++ 通常不会强加给用户 - “您只需为使用的内容付费”。

wiki 文章的示例调用部分很好地展示了技术方面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM