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

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 的调用不涉及查找/动态调度,因为它们不是虚拟成员函数。

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

是的。

【讨论】:

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

delphi中覆盖override父类的静态方法和虚函数有啥不同?

请教,父类中如何调用子类中的虚函数

派生类中的静态方法可以在 C++ 中调用受保护的构造函数吗?

使用基类中的函数静态调用纯虚函数的派生类实现

派生自抽象基类并调用另一个类中的方法的 C++ 包装类,该类也派生自抽象基类

虚函数和基类中的this指针的问题!