C++ kérdések

Kezdőlap Fórumok Programozás C++ kérdések

10 bejegyzés megtekintése - 11-20 / 120
  • Szerző
    Bejegyzés
  • #2023678
    kl223
    Felhasználó
      #2023679
      pointux
      Felhasználó

        „Hogyan lehet azt megoldani, hogy legyenek olyan (akár kívülrõl is elérhetõ) metódusai egy bázisosztálynak, amiket nem lehet felüldefiniálni?”
        public:
        virtual valami();

        A public miatt mindenhonnan elérhetõ, a virtual miatt átdefiniálható. (De valahol legalább egy üres függvényt mindenképpen létre kell hozni.)
        (Igen gyakran használt, bár általában protecteddel…)

        #2023680
        kl223
        Felhasználó
          vizsla wrote:
          „Hogyan lehet azt megoldani, hogy legyenek olyan (akár kívülrõl is elérhetõ) metódusai egy bázisosztálynak, amiket nem lehet felüldefiniálni?”
          public:
          virtual valami();

          A public miatt mindenhonnan elérhetõ, a virtual miatt átdefiniálható. (De valahol legalább egy üres függvényt mindenképpen létre kell hozni.)
          (Igen gyakran használt, bár általában protecteddel…)

          Hm. De nekem az lenne a célom, hogy NE lehessen felüldefiniálni.
          Javaban van erre lehetõség. De c++ban?

          kl223

          #2023681
          pointux
          Felhasználó

            „Hm. De nekem az lenne a célom, hogy NE lehessen felüldefiniálni.”
            Jaj, bocs… kicsit szelektív a látásom :)))
            Ilyen c++-ban tudomásom szerint nincs (egyébként a legközelebbi jelentése – változók esetében – a const)
            Helyette az van, hogy csak a virtuallal definiálhatsz valamit újra… anélkül csak újat hozhatsz létre. (Tehát egy osztályon belül erre hibát írna ki.)
            Magyarán szólva virtuallal a fõ* osztály már az al* osztály függvényét hívja meg. Amíg virtual nélkül a fõ* osztály csak a sajátját, amíg az al* osztály. (Az eredetit nem tudom, hogy hogy lehet elérni… max. trükkel.)

            *fõ amibõl származtatva van az al osztály

            #2023682
            kl223
            Felhasználó
              vizsla wrote:
              „Hm. De nekem az lenne a célom, hogy NE lehessen felüldefiniálni.”
              Jaj, bocs… kicsit szelektív a látásom :)))
              Ilyen c++-ban tudomásom szerint nincs (egyébként a legközelebbi jelentése – változók esetében – a const)
              Helyette az van, hogy csak a virtuallal definiálhatsz valamit újra… anélkül csak újat hozhatsz létre. (Tehát egy osztályon belül erre hibát írna ki.)
              Magyarán szólva virtuallal a fõ* osztály már az al* osztály függvényét hívja meg. Amíg virtual nélkül a fõ* osztály csak a sajátját, amíg az al* osztály. (Az eredetit nem tudom, hogy hogy lehet elérni… max. trükkel.)

              *fõ amibõl származtatva van az al osztály

              értem. Magyarán szólva a virtualnal, ha a származtatott osztályt egy szülõosztály-típusú objektumban tároljuk, akkor is a gyermekosztály fgv-je hívódik meg. Pl:

              class SzuloOsztaly {
                  public:
                      virtual void kiir() { std::cout < < "SzuloOsztaly!"; }
              };

              class GyermekOsztaly : public SzuloOsztaly {
                  public:
                      virtual void kiir() { std::cout < < "GyermekOsztaly!"; }
              };

              Ekkor:

              GyermekOsztaly a;
              SzuloOsztaly b = a;
              b.kiir();

              Kimenete „Gyermekosztaly!” lesz, hiába hogy egy „SzuloOsztaly” típusú objektumról van szó egyébként.
              Azzal a nem-felüldefiniálható cuccal meg majd még kísérletezek, hátha sikerül vmit elérnem. Ha igen, írom majd.

              kl223

              #2023683
              pointux
              Felhasználó

                Kicsit tulbonyolítod.. de végül is igen.
                Annyi a lényege, hogy virtual esetén dinamikusan döntõdik el, hogy melyik függvény hajtódik végre, amíg nem virtual esetén az ami az osztályban van deklarálva. Természetesen abban az esetben, amire te gondolsz örököl egyet, meg definiál is egyet – és c++ban ez megengedett (ebben az esetben még akkor is, ha teljesen egyforma a prototípusa).

                Amire én gondoltam az a következõ:

                class SzuloOsztaly {
                    public:
                        virtual void kiir() { std::cout < < "SzuloOsztaly!"; }
                        void call_kiir() { kiir(); }
                };

                class GyermekOsztaly : public SzuloOsztaly {
                    public:
                        virtual void kiir() { std::cout < < "GyermekOsztaly!"; }
                };

                Ekkor:

                Virtual használata nélkül:
                GyermekOsztaly a;
                a.call_kiir(); // SzuloOsztaly!

                Ebben az esetben tehát 2 „kiir” létezik létezik a GyermekOsztaly-ban. (mindvégig)
                (Na ez az a trükk, amirõl beszéltem.)

                Virtual használatával:
                GyermekOsztaly a;
                a.call_kiir(); // GyermekOsztaly!

                Ebben az esetben meg technikailag már csak egy létezik a GyermekOsztaly-ban.

                #2023684
                kisbetu
                Felhasználó
                  #2023685
                  VBalint
                  Felhasználó

                    Bár ez C
                    de az #include direktívák mögé nem ; kell
                    hanem ilyenek
                    #inculde
                    #include

                    aztán meg elvileg az ioperm és társai fordításához be kell kapcsolni az optimalizációt és az se baj ha nem a.out lesz a kimenet
                    gcc -o port -O2 port.c
                    és futtathatod is (root-ként)
                    ./port
                    Témáról bõvebben:
                    http://www.tldp.org/HOWTO/IO-Port-Programming.html

                    #2023686
                    VBalint
                    Felhasználó


                      a kacsacsõr jelet kiszedi a fórum
                      az volt a másik fórumozó baja is biztos
                      na lássuk így jó- e

                      Code:
                      #include
                      #include
                      #2023687
                      VBalint
                      Felhasználó

                        nem
                        😡
                        béna vagyok
                        elõnézetben is kiderült volna 🙂
                        bocs mindenkitõl

                      10 bejegyzés megtekintése - 11-20 / 120
                      • Be kell jelentkezni a hozzászóláshoz.