错误 C2660:'Aba::f':函数不接受 0 个参数

error C2660: 'Aba::f' : function does not take 0 arguments

本文关键字:参数 不接受 Aba C2660 错误 函数      更新时间:2023-10-16

我想知道为什么在下面的函数中有一个错误:

#include<iostream>
using namespace std;
class Saba
{
public:
    Saba(){ cout << "Saba Ctor" << endl; }
    Saba(const Saba& a){ cout << "Saba Copy Ctor" << endl; }
    ~Saba(){ cout << "Saba Dtor" << endl; }
    virtual void f(){ cout << "Saba f()" << endl; }
    virtual void g(){ cout << "Saba g()" << endl; }
    void h(){ cout << "Saba h()" << endl; }
};
class Aba : public Saba
{
public:
    Aba(){ cout << "Aba Ctor" << endl; }
    Aba(const Aba& a){ cout << "Aba Copy Ctor" << endl; }
    ~Aba(){ cout << "Aba Dtor" << endl; }
    virtual void g(){ cout << "Aba g()" << endl; }
    virtual void f(int){ cout << "Aba f(int)" << endl; }
    virtual void h(){ cout << "Aba h()" << endl; }
};
class Son : public Aba
{
public:
    Son(){ cout << "Son Ctor" << endl; }
    Son(const Son& a){ cout << "Son Copy Ctor" << endl; }
    ~Son(){ cout << "Son Dtor" << endl; }
    void f(){ cout << "Son f()" << endl; }
    void h(){ cout << "Son h()" << endl; }
};
int main()
{
    Saba* sabaPtr = new Son();
    Aba* abaPtr =dynamic_cast<Aba*>(sabaPtr);
    abaPtr->f();
    abaPtr->g();
    abaPtr->h();
    delete sabaPtr;
    return 0;
}

我得到一个错误"错误C2660: 'Aba::f':函数不接受0个参数"。但是"aba"继承自"saba"所以他可以使用"saba"的f()

Aba::f,接受1个参数,隐藏Saba::f。这就是为什么当你调用Aba::f没有参数编译器抱怨。只是为了你的信息,clang给了我那些警告:

main.cpp:38:18: warning: 'Aba::f'隐藏了重载的虚函数[- woverload -virtual]

virtual void f(int){ cout << "Aba f(int)" << endl; }
             ^

main.cpp:38:18:注意:这里声明了隐藏的重载虚函数'Aba::f':不同数量的形参(1 vs 0)

virtual void f(int){ cout << "Aba f(int)" << endl; }

我不知道你在写代码的时候期望什么,但是它能正常工作。

在初始化期间,您已经将指针从Saba转换为Aba:

Aba* abaPtr = dynamic_cast<Aba*>(sabaPtr);

所以,abaPtr是合适的Aba对象(当然如果动态强制转换成功的话)。接下来,在

行中
abaPtr->f();

你正在调用Aba::f(int),它期望指定一个参数,而你没有指定它。