gpt4 book ai didi

c++ - 为什么虚函数会被隐藏?

转载 作者:IT老高 更新时间:2023-10-28 21:38:05 24 4
gpt4 key购买 nike

我有以下类(class):

class A {
public:
virtual void f() {}
};


class B : public A{
public:
void f(int x) {}
};

如果我说

B *b = new B();
b->f();

编译器显示错误 C2660: 'B::f' : function does not take 0 arguments。B中的函数不应该重载它,因为它是一个虚函数吗?虚函数会这样隐藏吗?

编辑:我确实打算从 A 继承 B,这显示了相同的行为。

最佳答案

假设您打算 B源自 A :

f(int)f()是不同的签名,因此不同的功能。

您可以使用具有兼容签名的函数覆盖虚函数,这意味着签名相同,或者返回类型“更具体”(这是协方差)。

否则,您的派生类函数会隐藏虚函数,就像派生类声明与基类函数同名的函数的任何其他情况一样。你可以把using A::f;在 B 类中取消隐藏名称

您也可以将其称为 (static_cast<A*>(b))->f(); ,或作为 b->A::f(); .不同的是,如果 B实际上确实覆盖了 f() ,则前者调用override,而后者调用A中的函数无论如何。

关于c++ - 为什么虚函数会被隐藏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4146499/

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