Dziedziczenie, przeladowanie funkcji

0
#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.

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?

1
int main()
{
    Derived d;
    d.Base::fun();
    return 0;
}  
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ł.

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

	void fun(char)
	{
		cout << "Derived::fun(char) called";
	}
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1