JakasKlasa zmienna = new Klasa_Dziedzicząca_Po_JakaśKlasa(), czy da się coś takiego zrobić w C++?

0

Zacząłem właśnie książkę "Rusz głową! Wzorce projektowe".

Na początku jest w niej taki przykład pisany w Javie:

public abstract class KwakanieInterfejs
{  
        public void kwacz();
};


public class Kwacz implements KwakanieInterfejs
{
    
  
           public void kwacz()
                   {
                         println(" kwa! kwa! ");
                  }
  

};


public class DzikaKaczka extends Kaczka
{

  public DzikaKaczka()
        {
               kwakanieInterfejs = new Kwacz();
        } 

};


public abstract class Kaczka
{  
      KwakanieInterfejs kwakanieInterfejs;
        public void wykonajKwacz()
                {
                        kwakanieInterfejs.kwacz;
                };
};


int main()
{
Kaczka dzika = new DzikaKaczka();
dzika.wykonajKwacz();
}

Jak coś podobnego można zrobić najbardziej elegancko w c++?

Jedyne co mi przychodzi do głowy to zrobić coś takiego:

class Kaczka
{
    public:
        Kaczka();
        virtual ~Kaczka();

        void wykonajKwacz(Kwacz1 kwaknij)
        {
            kwaknij.kwacz();
        };

        void wykonajKwacz(Kwacz1 kwaknij)
        {
            kwaknij.kwacz();
        };
        
         void wykonajKwacz(Kwacz3 kwaknij)
        {
            kwaknij.kwacz();
        };
};



class DzikaKaczka : public Kaczka
{
public:
    DzikaKaczka();
    virtual ~DzikaKaczka();

  WykonajKwacz()
    {
        wykonajKwacz(kwacz);

    }


protected:
    Kwacz1 kwacz;

};
1

Tak, tylko musisz użyć zapisu ze wskaźnikami. Ale zamiast tego: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

1

Szukaj pod hasłem "polimorfizm".

1

A to jest poprawny kod Java? Nie wiem, ale nie wygląda.
W C++:

class KwakanieInterfejs
{  
public:
    virtual ~KwakanieInterfejs() {}
    virtual void kwacz() = 0;
};

class Kwacz : public KwakanieInterfejs
{
public:
    void kwacz() {
        std::cout << " kwa! kwa! \n";
    }
};

class Kaczka {
    std::uniue_ptr<KwakanieInterfejs> kwakanieInterfejs;
     
public:
    Kaczka(std::uniuqe_ptr<KwakanieInterfejs> &&k) : kwakanieInterfejs{ std::move(k) }
    {}
    void wykonajKwacz() {
        kwakanieInterfejs->kwacz();
    };
};

class DzikaKaczka : public Kaczka
{
public:
    DzikaKaczka()
        : Kaczka(std::make_unique<Kwacz>())
    {}
};

int main()
{
    auto dzika = std::make_unique<DzikaKaczka>();
    dzika->wykonajKwacz();
}
0

Dzięki za pomoc. Post MarekR22-a to chyba odpowiedź na moje pytanie. Szczerze mówiąc w C++ nie wygląda to już tak przyjemnie jak w Javie.

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