关于c#:用C ++重写虚函数

virtual function overriding in C++

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

1
int Start(bool, MyType *)

但不是虚拟的

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

1
2
3
4
5
int Derived::Start(bool b, MyType *mType)
{
    m_mType = mType;
    return Start(b);
}

但它给出了编译错误。

1
"Start' : function does not take 1 arguments"

但是,Base::Start(b)起作用

在C中,上述代码有效,即解析调用不需要引用base。

外部,如果调用如下

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

失败的消息是:

1
Start : function does not take 1 arguments

但在C中,同样的场景也起作用。

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

但电话并没有按预期得到解决。

请帮忙


您的两个选项要么是添加using Base::Start,以解决Start的范围。

1
2
3
4
5
6
int Derived::Start(bool b, MyType *mType)
{
    using Base::Start;
    m_mType = mType;
    return Start(b);
}

或者如您所指出的,添加Base::前缀。

1
2
3
4
5
int Derived::Start(bool b, MyType *mType)
{
    m_mType = mType;
    return Base::Start(b);
}


这是因为名字隐藏。

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

您有两种选择:要么像Base::Start(b)那样完全限定您的通话资格,要么在您的班级中加入using声明:

1
using Base::Start;