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:29: 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.