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

时间:2015-07-20 15:18:11

标签: c++ inheritance virtual-functions

我想知道为什么以下函数出现错误:

#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()

2 个答案:

答案 0 :(得分:1)

带有1个参数的

Aba::f会隐藏Saba::f。这就是为什么当你在没有参数的情况下调用Aba::f时编译器会抱怨。只是为了你的信息,clang给了我那些警告:

  

main.cpp:38:18:警告:&#39; Aba :: f&#39;隐藏重载的虚函数[-Woverloaded-virtual]

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

main.cpp:38:18:注意:隐藏的重载虚函数&#39; Aba :: f&#39;在这里声明:不同数量的参数(1对0)

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

答案 1 :(得分:0)

我不知道您在编写代码时期望的是什么,但它可以正常工作。

在初始化过程中,您已将指针从Saba转换为Aba

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

因此,abaPtr是正确的Aba对象(当然,如果动态强制转换是成功的)。接下来,在行

abaPtr->f();

您正在呼叫Aba::f(int),在您未指定时,需要指定1个参数。