Właśnie przerabiam jeden program z C# do C++ i zauważyłem bardzo dziwną rzecz, Działam w Qt Creator 4.11.0, a gcc mam w wersji 9.4.0 na Ubuntu Linux.
W pliku *.pro dopisałem CONFIG += c++20
, żeby można było korzystać między innymi z unique_ptr
.
Są dwie klasy, klasa foo
i klasa bar
dziedzicząca po foo
. Obie klasy zawierając funkcje Func
, ale z różnymi parametrami, a więc te funkcje w ogóle nie kolidują się.
W takim razie, obiekt klasy bar
powinien mieć funkcję Func
w dwóch wersjach, przy czym wersja bezargumentowa jest odziedziczona z klasy foo
.
class foo
{
public:
void Func()
{
}
};
class bar : public foo
{
public:
void Func(int I)
{
}
void Test()
{
Func(); // <--- W tym miejscu kompilator wskazuje błąd
}
};
Taki kod nie kompiluje się, pojawia się błąd: main.cpp błąd: no matching function for call to ‘bar::Func()’
Czyli kompilator GCC nie widzi funkcji odziedziczonej z klasy bazowej. Natomiast sam Qt Creator, poprzez śledzenie definiecji (klawisz F2) dociera do funkcji bazowej, czyli widzi funkcję, kod jest poprawny.
Natomiast, jak się usunie funkcję Func(int I)
z klasy bar
, to kod kompiluje się, a ta funkcja nie ma nic wspólnego z tym problemem, nie jest nigdzie użyta.
Jak się z klasy foo
skopiuje funkcję Func()
do klasy bar
, to kod już się kompiluje, ale nie po to wymyślono dziedziczenie, żeby powtarzać te same metody.
Co jest tego przyczyną? Jak to jest, że funkcja o tej samej nazwie, ale innych parametrach przeszkadza w skompilowaniu kodu, skoro nie ma żadnej kolizji z powodu innych parametrów?
Jak spowodować, żeby załączony kod kompilował się bez zmieniania nazwy funkcji? Nie ma tu polimorfizmu, bo nie ma dwóch funkcji o tej samej nazwie i tych samych parametrach.