当没有"使用 Base_class::function_name"时,如何选择重载的虚拟函数
How are overloaded virtual functions chosen when there's no `using Base_class::function_name`
下面是两个重载虚函数的类:
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的虚函数表中。
相关文章:
- 如何使用默认参数等选择模板专业化
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 选择要调用的构造函数
- C++选择排序算法中的逻辑错误
- QTreeView幻灯片多选后无法使用单击选择
- 无法获取菜单选择以运行函数.C++
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 在C++中,如何通过几种类型从元组中选择多个元素
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 对可变参数使用声明.如何选择正确的功能
- 选择选举获胜者的程序
- 如何选择在 csv 文件中输出的位置
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 选择和修改嵌套向量中的条目的最佳实践
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 用do-nile循环编写程序,并要求其选择用户选择是/否
- 当我从可用选择中选择基础链接时,为什么要获得怪异的输出
- C++如何继续主,直到用户选择退出选择
- QGraphicsitem在选择/未选择时发出信号