派生类中的方法调用算作虚函数调用吗?

Posted

技术标签:

【中文标题】派生类中的方法调用算作虚函数调用吗?【英文标题】:Do method calls in derived classes count as virtual function calls? 【发布时间】:2016-01-30 21:27:44 【问题描述】:

假设我有一个抽象基类和一个像这样的派生类,

class Base 
public:
    virtual void doSomething() = 0;


class Derived: public Base 
private:
    void doSomethingSpecificA();
    void doSomethingSpecificB();
public:
    void doSomething();

然后我用

初始化我的派生类
Base *instance = new Derived;.

现在,假设我将doSomething 的派生版本称为:

instance->doSomething();

doSomething() 调用私有方法doSomethingSpecificA()doSomethingSpecificB()。这些对specific 函数的内部调用是否需要与对doSomething() 的原始调用所需的相同数量的vtable 工作?还是它们仅相当于一个标准的方法调用?

【问题讨论】:

doSomethingSpecificAdoSomethingSpecificB 不是虚函数,首先在 vtable 中没有它们的条目。对它们的调用是常规方法调用。检查生成的程序集,自己看看。 【参考方案1】:

这些对特定函数的内部调用是否需要与最初调用 doSomething() 所需的相同数量的 vtable 工作?

没有。对doSomethingSpecificAdoSomethingSpecificB 的调用不涉及查找/动态调度,因为它们不是虚拟成员函数。

或者它们是否等同于标准方法调用?

是的。

【讨论】:

以上是关于派生类中的方法调用算作虚函数调用吗?的主要内容,如果未能解决你的问题,请参考以下文章