C++中的虚函数重写

3

我有一个基类,其中包含虚函数 - int Start(bool) 在派生类中,有一个同名但签名不同的函数 -

int Start(bool, MyType *)

但不是虚拟的

在派生类的Start()函数中,我想调用基类的Start()函数。

int Derived::Start(bool b, MyType *mType)
{
    m_mType = mType;
    return Start(b);
}

但是它会出现编译错误。
"Start' : function does not take 1 arguments"

然而Base::Start(b)起作用。

在C#中,上述代码可以正常工作,即不需要引用Base来解析调用。

如果外部调用如下:

Derived *d = new Derived();
bool b;
d->Start(b);

出现错误,信息如下:

Start : function does not take 1 arguments

但是在C#中,相同的情况却可以正常工作。

据我理解,虚拟机制不能用于解析调用,因为这两个函数具有不同的签名。

但是这些调用并没有按预期解析。

请帮忙。


它们必须完全匹配,否则就是重载 - Daniel A. White
很可能是重复的问题https://dev59.com/EHI-5IYBdhLWcg3w48xO。 - xanatos
3
在 C# 中,上述代码可以运行。C# 不是 C++。 - PaulMcKenzie
2个回答

4
你有两个选择,要么添加 using Base::Start 来解决 Start 的作用域问题。
int Derived::Start(bool b, MyType *mType)
{
    using Base::Start;
    m_mType = mType;
    return Start(b);
}

或者如您所指出的,添加Base::前缀。
int Derived::Start(bool b, MyType *mType)
{
    m_mType = mType;
    return Base::Start(b);
}

请注意,Base位于嵌套命名空间中。因此,我给出了A :: B :: C :: Base :: Start。使用using选项时,在IDE中显示以下错误 -“不允许类限定名称”。 - G.S

3

这是由于名称隐藏导致的。

当您在派生类中声明一个与基类中同名的函数时,基类版本将被隐藏并且无法通过未限定调用访问。

您有两个选项:要么像Base::Start(b)一样完全限定您的调用,要么在您的类中放置一个using声明:

using Base::Start;

在派生类成员函数中调用时,使用完全限定名称看起来很好。但是,对于从派生类对象调用Base :: Start()的调用,则使用using指令的第二种方法更好。但是,这会导致错误-"不允许使用完全限定名称"。 - G.S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接