Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Problemy z metoda klasy pochodniej

Ostatnio zmodyfikowano 2015-11-07 19:33
Autor Wiadomość
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ą
C/C++
#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(); // <- BLAD
    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
P-139747
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ć.
P-139748
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
P-139749
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.
P-139751
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'|
P-139753
Monika90
» 2015-11-07 14:58:27
Łatwiej jest mi napisać poprawny kod, niż wytłumaczyć wszystko
C/C++
#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
C/C++
int main()
{
    std::unique_ptr < C_BAZA > bz = std::make_unique < C_POCHODNIA >();
    bz->HelloWorld();
    bz->Funkcja();
    return 0;
}
P-139759
Gibas11
» 2015-11-07 15:58:25
Sądzę, że autorowi chodziło o uniknięcie deklarowania tej metody w klasie
C_BAZA
.
P-139762
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();
 
P-139765
« 1 » 2
  Strona 1 z 2 Następna strona