具有相同名称但不同参数和 return 类型的虚函数

Virtual functions with same name but different arguments and return types

我在面试中被问到这个问题。我的回答是(3 和 3.6)(错误)。 请解释我的理解是错误的

我的想法是指针 bd 将指向派生的 class vtable 的 _vptr。

Derived 的 Vtable class 将包含 2 个函数

double func(double) // ----->points to Derived::func()
int func(int)       // ----->points to Base::func()

因此,

bd->func(2)   // will call Base::func() i.e int func(int)
bd->func(2.3) // will call Derived::func() i.e double func(double)

请解释我的理解是错误的。 另外,解释一下 Base::func() 不是 virtual 的情况。 那样的话,就没有vtable了吧?函数调用将如何解决?

#include <iostream>    
using namespace std;

class Base
{
private:
    /* data */
public:
    Base(/* args */){};
    ~Base(){};

    //int func(int i)     getting same answer regardless of virtual
    virtual int func(int i)
    {
        cout << "Base func()" << endl;
        return i+1;
    }
};

class Derived : public Base
{
public:
    Derived(/* args */){};
    ~Derived(){};

    double func(double d)
    {
        cout << "Derived func()" << endl;
        return d+1.3;
    }
};

int main() {
    Base* bd = new Derived();
    cout << bd->func(2) << endl;
    cout << bd->func(2.3) << endl;
    return 0;
}

预期输出:

Base func()
3
Derived func()
3.6

Actual output:
Base func()
3
Base func()
3

Base 中没有采用 double 的函数。你所拥有的只是一个指向 Base 的指针。因此 2.3 被截断为 int2 并调用 Base::func(int i)

Derived::func(double d) 在此代码中根本没有发挥作用。

funcBase中是virtual并不重要,因为Derived中的func不是override (签名不匹配)。将 override 关键字添加到 Base::func 将立即清除编译器错误。