Polymorphie und virtuelle Funktionen in C++
(Diese Lektion ist nur eine kurze Notiz und noch nicht ausformuliert.)
example
struct base { virtual int f() const { return 0; }}
struct derived_a : base { int f() const override { return +1; }}
struct derived_b : base { int f() const override { return -1; }}
Wann braucht man Laufzeit-Typen?
Man liest vom Benutzer etwas ein, das eine Zahl oder ein Text sein kann.
Man durchstreift einen binären Baum, und die linke oder rechte Seite kann ein Baum oder ein Atom sein.
main.cpp
#include <initializer_list>
#include <iostream>
#include <memory>
#include <ostream>struct B
{ void n() const;
virtual void v() const ;
virtual ~B(); };void ::B::n() const { ::std::cerr << "::B::n\n"; }
void ::B::v() const { ::std::cerr << "::B::v\n"; }
B::~B() = default;
struct D : public B
{ void n() const;
void v() const override;
~D() override; };void ::D::n() const { ::std::cerr << "::D::n\n"; }
void ::D::v() const { ::std::cerr << "::D::v\n"; }
D::~D() = default;
int main()
{ ::D const d;
::B const * b = &d;b->n();
b->v(); ::std::cerr << '\n';d.n();
d.v(); ::std::cerr << '\n';b->::B::n();
b->::B::v(); ::std::cerr << '\n';d.::D::n();
d.::D::v(); ::std::cerr << '\n'; }Protokoll
::B::n
::D::v
::D::n
::D::v
::B::n
::B::v
::D::n
::D::v
F:\r\j\autocomp\main.cpp:8:8: warning: 'B' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [clang-diagnostic-weak-vtables]
struct B
^
F:\r\j\autocomp\main.cpp:19:8: warning: 'D' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [clang-diagnostic-weak-vtables]
struct D : public B
^