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