basic_ios和basic_fstream的RDBUF [已关闭]

rdbuf in basic_ios and basic_fstream [closed]

提问人:Jordan Motta 提问时间:8/27/2023 最后编辑:πάντα ῥεῖJordan Motta 更新时间:8/27/2023 访问量:31

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将有助于其他人回答这个问题。

3个月前关闭。

社区在 3 个月前审查了是否重新讨论这个问题,并将其关闭:

原始关闭原因未解决

我正在检查具有以下方法的basic_ios文档:

enter image description here

但是当我看到basic_fstream时,我发现了这一点:

enter image description here

AFAIK C++ 不能有两个同名但返回类型不同的函数。这与OOP的工作方式有关吗?

我尝试了这样的简单演示,它有效,老实说,我不明白为什么。

enter image description here

所以我的问题是:那里发生了什么?

C++ 哎呀 std

评论

6赞 πάντα ῥεῖ 8/27/2023
请不要在这里使用代码或其他纯文本的图片!
1赞 wohlstad 8/27/2023
除了将代码发布为文本之外,您还可以发布指向 Godbolt(编译器资源管理器)页面的链接(在 Godbolt 的“共享”菜单下获取它)。

答:

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()Barfoo(int)

struct Bar : Foo
{
    using Foo::foo;
    void foo(int);
};

这同样适用于 的情况,允许 中的方法返回不同的类型,因为它不是相同的函数,它是一个具有相同名称的新函数。rdbufstd::basic_fstream

这不适用于虚函数,此代码不会像现在覆盖基类那样编译,因此必须匹配:foo

struct Foo
{
    virtual void foo();
};

struct Bar : Foo
{
    int foo();
};

但请注意,即使使用虚拟函数,您也可以引入具有不同参数的新方法,并且除非显式导入,否则它将再次隐藏基类虚拟方法:

struct Foo
{
    virtual void foo();
};

struct Bar : Foo
{
    void foo(int);
};