提问人:Jordan Motta 提问时间:8/27/2023 最后编辑:πάντα ῥεῖJordan Motta 更新时间:8/27/2023 访问量:31
basic_ios和basic_fstream的RDBUF [已关闭]
rdbuf in basic_ios and basic_fstream [closed]
问:
我正在检查具有以下方法的basic_ios文档:
但是当我看到basic_fstream时,我发现了这一点:
AFAIK C++ 不能有两个同名但返回类型不同的函数。这与OOP的工作方式有关吗?
我尝试了这样的简单演示,它有效,老实说,我不明白为什么。
所以我的问题是:那里发生了什么?
答:
2赞
BoP
8/27/2023
#1
如果两个函数位于不同的作用域中,则可以有两个具有相同签名的函数。与其基类相比,派生类就像一个内部作用域。
新函数将在基类中隐藏类似的命名事物。
3赞
Alan Birtles
8/27/2023
#2
派生类中的非虚拟方法与基类中的同名方法无关。这会产生一些潜在的令人惊讶的影响,例如,此代码无法编译:
struct Foo
{
void foo();
};
struct Bar : Foo
{
void foo(int);
};
int main()
{
Bar bar;
bar.foo();
}
尽管您可能希望基类可以从中调用,但这并不是因为基类方法不是重载,而是具有相同名称的新方法。如果要将其作为重载,则需要从基类中显式导入它:foo()
Bar
foo(int)
struct Bar : Foo
{
using Foo::foo;
void foo(int);
};
这同样适用于 的情况,允许 中的方法返回不同的类型,因为它不是相同的函数,它是一个具有相同名称的新函数。rdbuf
std::basic_fstream
这不适用于虚函数,此代码不会像现在覆盖基类那样编译,因此必须匹配:foo
struct Foo
{
virtual void foo();
};
struct Bar : Foo
{
int foo();
};
但请注意,即使使用虚拟函数,您也可以引入具有不同参数的新方法,并且除非显式导入,否则它将再次隐藏基类虚拟方法:
struct Foo
{
virtual void foo();
};
struct Bar : Foo
{
void foo(int);
};
评论