[C++] Problemy z metoda klasy pochodniej
Ostatnio zmodyfikowano 2015-11-07 19:33
00Andre Temat założony przez niniejszego użytkownika |
[C++] Problemy z metoda klasy pochodniej » 2015-11-07 13:48:03 Witam was Mam mały problem. Mam klasę bazową i pochodnią #include <iostream>
class C_BAZA { public: virtual void HelloWorld(); };
class C_POCHODNIA : public C_BAZA { public: void HelloWorld() { std::cout << "Hello World\n"; } void const Funkcja() { std::cout << "FUNKCJA"; } virtual ~C_POCHODNIA() { }; };
int main() { C_BAZA * bz = new C_POCHODNIA; bz->HelloWorld(); bz->Funkcja(); delete bz; return 0; }
Błąd: error: 'class C_BAZA' has no member named 'Funkcja'|
Przy wywołaniu funkcji Funkcja() jest błąd. Wiem jak ten błąd rozwiązać dodając deklarację funkcji wirtualnej w klasie bazowej, ale ja mam inny cel. Chce aby wywołała się ta funkcja, nie wpisując deklaracji funkcji w klasie bazowej. Bardzo mi na tym zależy, aby tak było. Pozdrawiam 00Andre |
|
Gibas11 |
» 2015-11-07 13:52:27 Nie da się tak, C_BAZA nie ma tej metody, więc nie da się jej wywołać. |
|
00Andre Temat założony przez niniejszego użytkownika |
» 2015-11-07 13:59:37 Kurcze ... Ja myślałem, że się uda. Bo wskaźnik typu C_BAZA wskazuje na C_POCHODNIA to chyba powinien być dostęp |
|
Gibas11 |
» 2015-11-07 14:07:53 Kompilator traktuje to jako obiekt typu C_BAZA, więc nie wie o tej metodzie. Możesz spróbować zrobić tak: (( C_POCHODNA * ) bz )->Funkcja(); , ale nie wiem czy zadziała. |
|
00Andre Temat założony przez niniejszego użytkownika |
» 2015-11-07 14:15:32 Wcześniejszego błędu nie ma, ale jest nowy błąd undefined reference to `vtable for C_BAZA'|
|
|
Monika90 |
» 2015-11-07 14:58:27 Łatwiej jest mi napisać poprawny kod, niż wytłumaczyć wszystko #include <iostream>
class C_BAZA { public: virtual void HelloWorld() = 0; virtual void Funkcja() const = 0; virtual ~C_BAZA() { } };
class C_POCHODNIA : public C_BAZA { public: void HelloWorld() override { std::cout << "Hello World\n"; } void Funkcja() const override { std::cout << "FUNKCJA"; } };
int main() { C_BAZA * bz = new C_POCHODNIA; bz->HelloWorld(); bz->Funkcja(); delete bz; return 0; }
A jeszcze lepiej będzie użyć inteligentnych wskaźników int main() { std::unique_ptr < C_BAZA > bz = std::make_unique < C_POCHODNIA >(); bz->HelloWorld(); bz->Funkcja(); return 0; }
|
|
Gibas11 |
» 2015-11-07 15:58:25 Sądzę, że autorowi chodziło o uniknięcie deklarowania tej metody w klasie C_BAZA . |
|
carlosmay |
» 2015-11-07 16:16:29 undefined reference to `vtable for C_BAZA'| myślę, że ten błąd może być spowodowany brakiem ciała metody virtual void HelloWorld(); |
|
« 1 » 2 |