Vererbung in C++ [] (Vererbung in C++), Antwort auf Frage, Seite 722387
https://www.purl.org/stefan_ram/pub/vererbung_c++ (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C++-Kurs

Vererbung (Ableitung, type derivation) in C++ 

Diese Lektion enthält Notizen für den Dozenten, sie ist aber noch nicht so ausformuliert, daß sie im Selbststudium gelesen werden kann.

Erben

#include <iostream>

#include <ostream>

#include <string>

#include <memory>

using namespace ::std::literals;



struct base

{ base(){ ::std::cout << "base called.\n"s; }

  base( int i ){}

  static void  s(){ ::std::cout << "base s\n"s; }

  void         m() const { ::std::cout << "base m\n"s; }

  virtual void v() const { ::std::cout << "base v\n"s; }};



struct derived : base

{ };



int main()

{ { ::base b{ 0 };

    ::std::cout << "calling static     via base instance\n"s; b.s();

    ::std::cout << "calling non-static via base instance\n"s; b.m();

    ::std::cout << "calling virtual    via base instance\n"s; b.v();

}

  { /* geht nicht, konstruktoren werden nicht vererbt: */ /* ::derived d{ 0 } */

    ::derived d;

    ::std::cout << "calling static     via derived instance\n"s; d.s();

    ::std::cout << "calling non-static via derived instance\n"s; d.m();

    ::std::cout << "calling virtual    via derived instance\n"s; d.v(); }

  { ::std::unique_ptr< ::base    >bd = ::std::make_unique< ::derived >();

    ::std::cout << "calling static     via base pointer to derived\n"s; bd->s();

    ::std::cout << "calling non-static via base pointer to derived\n"s; bd->m();

    ::std::cout << "calling virtual    via base pointer to derived\n"s; bd->v(); }

  { ::std::unique_ptr< ::derived >dd = ::std::make_unique< ::derived >();

    ::std::cout << "calling static     via derived pointer to derived\n"s; dd->s();

    ::std::cout << "calling non-static via derived pointer to derived\n"s; dd->m();

    ::std::cout << "calling virtual    via derived pointer to derived\n"s; dd->v(); }

  { ::derived d; ::base & bd = d;

    ::std::cout << "calling static     via base reference to derived\n"s; bd.s();

    ::std::cout << "calling non-static via base reference to derived\n"s; bd.m();

    ::std::cout << "calling virtual    via base reference to derived\n"s; bd.v(); }

  { ::derived d; ::derived & dd = d;

    ::std::cout << "calling static     via derived reference to derived\n"s; dd.s();

    ::std::cout << "calling non-static via derived reference to derived\n"s; dd.m();

    ::std::cout << "calling virtual    via derived reference to derived\n"s; dd.v(); }}









calling static     via base instance

base s

calling non-static via base instance

base m

calling virtual    via base instance

base v

base called.

calling static     via derived instance

base s

calling non-static via derived instance

base m

calling virtual    via derived instance

base v

base called.

calling static     via base pointer to derived

base s

calling non-static via base pointer to derived

base m

calling virtual    via base pointer to derived

base v

base called.

calling static     via derived pointer to derived

base s

calling non-static via derived pointer to derived

base m

calling virtual    via derived pointer to derived

base v

base called.

calling static     via base reference to derived

base s

calling non-static via base reference to derived

base m

calling virtual    via base reference to derived

base v

base called.

calling static     via derived reference to derived

base s

calling non-static via derived reference to derived

base m

calling virtual    via derived reference to derived

base v

Neudefinieren




struct base { base( int i ){} };

struct derived : base {};

int main(){ ::derived d; }



prog.cpp: In function 'int main()':

prog.cpp:3:23: error: use of deleted function 'derived::derived()'

 int main(){ ::derived d; }

                       ^

prog.cpp:2:8: note: 'derived::derived()' is implicitly deleted because the default definition would be ill-formed:

 struct derived : base {};

        ^

base() is not there, so derived cannot call base, so it would be ill-formed




#include <iostream>

#include <ostream>

#include <string>

#include <memory>

using namespace ::std::literals;



struct base

{ static void  s(){ ::std::cout << "base s\n"s; }

  void         m(){ ::std::cout << "base m\n"s; }

  virtual void v(){ ::std::cout << "base v\n"s; }};



struct derived : public base

{ static void  s(){ ::std::cout << "derived s\n"s; }

  void         m(){ ::std::cout << "derived m\n"s; }

  void         v(){ ::std::cout << "derived v\n"s; }};



int main()

{ { ::base b;

    ::std::cout << "calling static     via base instance\n"s; b.s();

    ::std::cout << "calling non-static via base instance\n"s; b.m();

    ::std::cout << "calling virtual    via base instance\n"s; b.v(); }

  { ::derived d;

    ::std::cout << "calling static     via derived instance\n"s; d.s();

    ::std::cout << "calling non-static via derived instance\n"s; d.m();

    ::std::cout << "calling virtual    via derived instance\n"s; d.v(); }

  { ::std::unique_ptr< ::base    >bd = ::std::make_unique< ::derived >();

    ::std::cout << "calling static     via base pointer to derived\n"s; bd->s();

    ::std::cout << "calling non-static via base pointer to derived ###\n"s; bd->m();

    ::std::cout << "calling virtual    via base pointer to derived ###\n"s; bd->v(); }

  { ::std::unique_ptr< ::derived >dd = ::std::make_unique< ::derived >();

    ::std::cout << "calling static     via derived pointer to derived\n"s; dd->s();

    ::std::cout << "calling non-static via derived pointer to derived\n"s; dd->m();

    ::std::cout << "calling virtual    via derived pointer to derived\n"s; dd->v(); }

  { ::derived d; ::base & bd = d;

    ::std::cout << "calling static     via base reference to derived\n"s; bd.s();

    ::std::cout << "calling non-static via base reference to derived ###\n"s; bd.m();

    ::std::cout << "calling virtual    via base reference to derived ###\n"s; bd.v(); }

  { ::derived d; ::derived & dd = d;

    ::std::cout << "calling static     via derived reference to derived\n"s; dd.s();

    ::std::cout << "calling non-static via derived reference to derived\n"s; dd.m();

    ::std::cout << "calling virtual    via derived reference to derived\n"s; dd.v(); }}



calling static     via base instance

base s

calling non-static via base instance

base m

calling virtual    via base instance

base v

calling static     via derived instance

derived s

calling non-static via derived instance

derived m

calling virtual    via derived instance

derived v

calling static     via base pointer to derived

base s

calling non-static via base pointer to derived ###

base m

calling virtual    via base pointer to derived ###

derived v

calling static     via derived pointer to derived

derived s

calling non-static via derived pointer to derived

derived m

calling virtual    via derived pointer to derived

derived v

calling static     via base reference to derived

base s

calling non-static via base reference to derived ###

base m

calling virtual    via base reference to derived ###

derived v

calling static     via derived reference to derived

derived s

calling non-static via derived reference to derived

derived m

calling virtual    via derived reference to derived

derived v

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722387 stefan_ram:722387 Vererbung in C++ Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722387, slrprddef722387, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/vererbung_c++