当没有"使用 Base_class::function_name"时,如何选择重载的虚拟函数

How are overloaded virtual functions chosen when there's no `using Base_class::function_name`

本文关键字:选择 何选择 函数 重载 虚拟 使用 Base class name function      更新时间:2023-10-16

下面是两个重载虚函数的类:

class Base
{
public:
    virtual void func(int) {
        cout<<"base int"<<endl;
    }
    virtual void func(double) {
        cout<<"base double"<<endl;
    }
};
class Deri: public Base
{
public:
    virtual void func(int) {
        cout<<"deri int"<<endl;
    }
};

我在这里使用这些类:

int main() {
    Base * ptr = new Deri;
    ptr->func(3.0);                     //"base double"
    static_cast<Deri *>(ptr)->func(3.0);//"deri int"
    return 0;
}

我期望这两个调用都是针对基本双重载的,但我得到以下输出:

base double 
deri int  

当我在Deri中添加以下"using"语句时:

using Base::func; 

我从基类中获得所有重载函数,它按预期工作。

当我不使用这个"using语句"时会发生什么?我假设ptr->func(3.0)static_cast<Deri*>->func(3.0)寻找相同的虚函数表。但是它们如何寻找不同的功能呢?Deri类的变量表是什么样的?

看这里:http://thesyntacticsugar.blogspot.ca/2011/10/behind-scenes-name-hiding-in-c.html

它说"当识别可能的候选者时,名称查找从直接作用域开始向外传播。只有当不存在具有正确名称的函数时,进程才会继续到下一个封闭作用域。一旦发现一个作用域至少有一个可行的候选者,编译器就会继续将实参与各种候选者的形参进行匹配,并应用访问规则等。

所以我的理解是指针的类型决定了名称查找从哪个范围开始。当它是基类的指针时,它首先在类基中查找。当static_cast到Deri类时,它首先查找类Deri。

值得注意的是,所有三个版本的func()都在类Deri的虚函数表中。