Dziedziczenie, przeladowanie funkcji

Dziedziczenie, przeladowanie funkcji
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0
Kopiuj
#include <iostream>

using namespace std;

class Base
{
public:
	void fun()
	{
		cout << "Base::fun() call";
	}

	void fun(int i)
	{
		cout << "Base::fun(int i) called";
	}
};

class Derived:public Base
{
public:
	void fun(char x)
	{
		cout << "Derived::fun(char x) called";
	}
};

int main()
{
	Derived d;
	d.fun();
	return 0;
} 

Dlaczego powyższy program się nie kompiluje? Przecież klasa Derived dziedziczy funkcję void fun() z klasy bazowej, a to że ma tą samą nazwę co void fun(char x) nie powinno mieć znaczenia. W końcu jest przeładowanie funkcji. Te dwie funkcje mają inne sygnatury.

JU
  • Rejestracja:około 22 lata
  • Ostatnio:2 miesiące
  • Postów:5042
0

Nie dziedziczy, tylko przeciąża. Jeśli miałaby dziedziczyć, to w klasie Base musiałaby być zadeklarowana jako virtual. A czemu Ci się nie kompiluje? Jakie są błędy?

MI
Wywala blad: Error C2660 'Derived::fun': function does not take 0 arguments test c:\users\mikołaj waśniewski\desktop\test\test\main.cpp 31 Co ma slowko virtual do rzeczy w tym przykladzie?
1
Kopiuj
int main()
{
    Derived d;
    d.Base::fun();
    return 0;
}  
EvilOne
  • Rejestracja:około 14 lat
  • Ostatnio:około 2 miesiące
  • Postów:78
3

Redefinicja funkcji klasy bazowej w klasie pochodnej powoduje, że wszystkie funkcje klasy bazowej o tej samej nazwie przestają być widoczne w klasie pochodnej. Możesz to zmienić dodając do klasy pochodnej deklarację using Base::fun; w sekcji public. Wtedy Twój kod będzie się kompilował.

Kopiuj
class Derived : public Base
{
public:
	using Base::fun;

	void fun(char)
	{
		cout << "Derived::fun(char) called";
	}
};
edytowany 1x, ostatnio: EvilOne

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.