gpt4 book ai didi

c++ - 重载虚函数并通过指向基类的指针调用派生函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:33:29 24 4
gpt4 key购买 nike

#include <bits/stdc++.h>
using namespace std;

class Base {
public:
virtual int function() const {
cout << "Base::function()\n";
return 1;
}
virtual void function(string) const {}
};


class Derived : public Base {
public:
// overloading function() of base
int function(int) const {
cout << "Derived::function()\n";
return 4;
}
};


int main()
{
string s("StackOverflow");
Derived d;
Base* b = &d;
//calling derived::function() and function(s)
b->function();
b->function(s);
}

由于重载,名称隐藏出现在派生类中。
由于关键字 virtual 在运行时应该调用 Derived::function()。

但是代码编译成功。链接:http://ideone.com/fbVm0P
这种奇怪行为的原因是什么?
编辑 1:

d.function();  
d.function(s);

如预期的那样没有编译。

最佳答案

重载决议使用静态类型(并不是说它会这里的区别)。所以 b->function()b->function( s )解析为 Base::function,没有错误。最后,由于这些函数已被声明为 virtual,最终的解决方案将采用考虑派生类中的任何重载。但是没有,所以将调用基类中的函数。

名称隐藏发生在名称查找期间,即重载之前分辨率,也只关注静态类型;在一个表达式中像 b->function()b->function( s ),编译器会忽略派生完全;它对静态类型进行名称查找。姓名隐藏只会考虑是静态类型派生;一旦编译器在 Derived 中找到了 function,它就会别再看了。

全局规则相当简单:名称查找(使用静态类型),然后重载解析(使用静态类型),最后,如果resolved name是一个虚函数,实际动态确定功能取决于动态类型。

关于c++ - 重载虚函数并通过指向基类的指针调用派生函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28514722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com