2015-07-20 2 views
0

Я хочу знать, почему возникает ошибка в следующей функции:ошибка C2660: «аба :: е»: функция не принимает аргументов 0

#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:«Аба :: f ': функция не принимает 0 аргументов ". Но «aba» унаследовано от «saba», поэтому он может использовать f() «saba»

ответ

1

Aba::f, который принимает 1 параметр, скрывает Saba::f. Поэтому, когда вы вызываете Aba::f без аргументов, компилятор жалуется. Просто для информации лязгом дал мне эти предупреждения:

main.cpp: 38: 18: предупреждение: 'аба :: е' скрывает перегруженные виртуальные функции [-Woverloaded виртуальные]

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

main.cpp: 38: 18: Примечание: скрытая перегружены виртуальная функция 'Аба :: е' объявляются здесь: различное число параметров (1 против 0)

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

Спасибо за исправления Tree With Eyes =) – Pumkko

0

Я не знаю, что вы ожидали при написании кода, но он работает правильно.

Во время инициализации вы отлиты указатель от Saba к Aba в:

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

Итак, abaPtr собственно Aba объект (если, конечно, динамическое приведение был преуспевающим). Далее, в строке

abaPtr->f(); 

вы вызываете Aba::f(int) который ожидает 1 аргумент указан в то время как вы не указали его.

Смежные вопросы