Wywołanie metody klasy pochodnej

0

Cześć,
Czy jest możliwość, aby wywołać metodę fun1 z klasy B? Wskaźnik musi być na typ A, a obiekt stworzony typu B. Wiem, że mogę dodać wirtualną metodę fun1 do klasy bazowej i to rozwiąże problem, ale szukam rozwiązania aby zmusić obiekt test aby wywołał metodę fun1.

#include <iostream>

using namespace std;

class A
{
public:
    virtual void fun() = 0;
};

class B : public A 
{
public:
    void fun()
    {
        cout<<"fun"<<endl;
    }
    
    void fun1()
    {
        cout<<"fun1"<<endl;
    }
 
};


int main()
{

    A * test;
    test = new B;
    
    test->fun1();
    
    return 0;
}
0

Możesz castować do B*, jeśli wiesz, że to na pewno B jest:

B* test_b = static_cast<B*>(test);
test_b->fun1();

PS: Masz brakujące delete, polecam lekturę: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

Co do samego pomysłu: jeśli planujesz rozwiązanie jakiegoś problemu to wygląda mi to na problem XY. Jeśli tylko ogarniasz podstawy to jest ok.

0

Dzięki,
Tak wiem o tym, że brakuje delete operatora. Załączony kod to tylko prykład, docelowo to będzie kod na mikrokontroler i destruktor nigdy nie będzie wywołany w przypadku tego obiektu.

Nie powinienem użyć dynamic_cast zamiast static_cast?

0

To zależy od tego, czy wiesz, że to obiekt tej klasy pochodnej, czy nie. Jeśli nie - dynamic_cast zwróci nullptr, a użycie static_cast to będzie UB. Przy czym: mikrokontroler i polimorfizm dynamiczny? Dziwnie mi to brzmi.

0

To taki trochę "większy" mikrokontroler niż Atmega.
Czy zastosowanie C++ w tym projekcie ma sens to nie wiem :), ja bym to wolał napisać w C :)

0

Można, zrobisz to rzutowaniem:

static_cast<B*>(test)->fun1();

Aczkolwiek, sposób jest raczej nierekomendowany bo można wlecieć na minę jak test nie zawiera typu B, zatem w takich sytuacjach lepiej się oprzeć na mechanizmie polimorfizmu. Jeśli polimorfizmu zastosować z różnych powodów nie można to przynajmniej ja w klasie bazowej tworzę wirtualną metodę type() która zwraca jakiej klasy jest to obiekt, i dopiero jak mam coś w stylu:

if (test->type() == Enum::KlasaB)
{
   //zrób rzutowanie na klasę B
} 

robię rzutowanie wskaźnika na rzeczywiście użytą klasę.

1
if (B *test2 = dynamic_cast<B *>(test)) {
   test2->fun1();
}

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