Wywołanie metody klasy pochodnej

Odpowiedz Nowy wątek
2019-03-12 16:23
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;
}

Pozostało 580 znaków

2019-03-12 16:28
kq
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[...]xx-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.


Pozostało 580 znaków

2019-03-12 16:36
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?

Pozostało 580 znaków

2019-03-12 16:38
kq
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.


Pozostało 580 znaków

2019-03-13 22:01
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 :)

Pozostało 580 znaków

2019-03-14 09:56
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ę.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 2x, ostatnio: MasterBLB, 2019-03-14 09:58
To się trochę kłóci z ideą polimorfizmu, w którym rzeczywisty typ nie powinien nas w ogóle obchodzić. No ale zdaje sobie sprawę, że czasem po prostu nie ma innego wyjścia. - tajny_agent 2019-03-14 15:47

Pozostało 580 znaków

2019-03-14 11:15
1
if (B *test2 = dynamic_cast<B *>(test)) {
   test2->fun1();
}

Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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