![](/img/trans.png)
[英]Call a derived class' (non-virtual) function in the base class' Destructor
[英]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++ 通常不会强加给用户 - “您只需为使用的内容付费”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.