gpt4 book ai didi

c++ - 调用虚函数时的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:38 26 4
gpt4 key购买 nike

我不明白这段代码有什么问题。它看起来像一个不可思议的陷阱!

这段代码:

class Foo
{
public:
virtual double foo(double x) const = 0;
double foo(int x) const { return (double)(x + x); }
};

class Bar : public Foo
{
public:
virtual double foo(double x) const { return x * x; }
};

int main()
{
Bar* b = new Bar;
Foo* f = b;
std::cout << b->foo(3) << " " << f->foo(3) << std::endl;
std::cout << b->foo(5.0) << " " << f->foo(5.0) << std::endl;
return 0;
}

打印以下输出:

9 6
25 25

我推断,当指针的类型为 Bar* 时,Bar::foo(double) const 会被隐式转换调用。但是为什么这样的事情会在没有任何警告的情况下发生?

我使用 GCC 4.7.2。我用 g++ -Wall foobar.cpp -o foobar.exe

编译

最佳答案

这是由于名称隐藏。

当您在 Bar 中声明一个名为 foo 的函数时,您将在 Foo 中隐藏所有具有相同名称的声明。

因此,当指针的静态类型为 Bar 时,编译器Bar 中找到采用 >double,因此它隐式转换 int 以满足此要求。

如果你想让 Foo 中的 int 版本可见,添加一个 using 声明:

class Bar : public Foo
{
public:
using Foo::foo;
// ^^ makes the versions in Foo visible
virtual double foo(double x) const { return x * x; }
};

关于c++ - 调用虚函数时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30751499/

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