WebHU - Programozási kérdések és válaszok

A származtatott osztályhoz rendelt alaposztálymutató

Létrehoztam az alaposztálymutatót, és új származtatott osztályt rendeltem hozzá.

 class Base
{ 
public: 
    virtual void f( int ); 
    virtual void f( double ); 
    virtual void g( int i = 10 ); 
}; 

void Base::f( int )
{ 
    cout << "Base::f(int)" << endl;
} 

void Base::f( double )
{ 
    cout << "Base::f(double)" << endl;
} 

void Base::g( int i )
{
    cout << i << endl;
} 

class Derived: public Base
{ 
public: 
    void f( complex<double> ); 
    void g( int i = 20 ); 
};

void Derived::f( complex<double> )
{ 
    cout << "Derived::f(complex)" << endl;
} 

void Derived::g( int i )
{ 
    cout << "Derived::g() " << i << endl;
} 

void main()
{ 
    Base b; 
    Derived d; 
    Base* pb = new Derived; 
    b.f(1.0); 
    d.f(1.0); 
    pb->f(1.0); 
    b->g();
    d->g();
    pb->g(); 
    delete pb; 
}

Az eredmény:

Base::f(double) 
Derived::f(complex) 
Base::f(double) 
10 
Derived::g() 20 
Derived::g() 10

A b és d eredmények várhatóak. A pb->f(1.0) meghívja az f(double) bázisfüggvényt, de úgy tűnik, hogy a pb->g() a g származtatott osztályfüggvényt hívja, de az i=10 paramétert használja az alaposztályból. Miért?


  • Miért? Mivel a Base felületet statikusan használja, a Derived::pb címre történő elküldés csak futásidőben történik. 13.03.2017
  • A delete pb; meghatározatlan viselkedést okoz, mivel a Base-nek nincs virtuális destruktora 13.03.2017

Válaszok:


1

Kerrek SB mindezt elmondta kommentben, kicsit részletezem.

Mint ebben a válaszban, az alapértelmezett függvényparaméterek feloldásának mechanizmusa a fordítási időben történik. Amikor a fordító látja a pb->g(); értéket, tudva, hogy a pb egy Base* típusú mutató, leolvassa a Base::g deklarációját, azaz

virtual void g( int i = 10);

A következő következtetéseket vonja le:

1- A hiányzó i paramétert 10-re kell állítani. Ez fordítási időbeli döntés.

2- A metódus virtuálisként van deklarálva, ami azt jelenti, hogy a ténylegesen meghívott metódus attól függ, hogy a pb mire fog mutatni futási időben. A fordító úgy állítja be a mechanizmust, hogy a hívást a g-ra küldje futás közben (általában a vtable-n keresztüli indirekt módon). Mivel futás közben előfordul, hogy pb valójában egy Derived típusú objektumra mutat, a Derived::g metódus hívódik meg.

12.03.2017
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..