Compare commits
No commits in common. "A10" and "main" have entirely different histories.
Binary file not shown.
@ -1,136 +0,0 @@
|
|||||||
# Struktur
|
|
||||||
Es gibt die Klasse A.
|
|
||||||
Es gibt die Klasse B, die von A erbt (public).
|
|
||||||
Es gibt eine Klasse C, die von B erbt (public).
|
|
||||||
Klasse A, B und C haben eine Funktion void a().
|
|
||||||
Klasse B und C haben eine Funktion void b().
|
|
||||||
# Klasse A
|
|
||||||
Klasse A hat nur void a(), nicht mal ein Konstrutor
|
|
||||||
void A::a(): macht nichts
|
|
||||||
# Klasse B
|
|
||||||
hat
|
|
||||||
## Public
|
|
||||||
- Konstruktor
|
|
||||||
- virtual Destruktor
|
|
||||||
- void a()
|
|
||||||
- virtual void b()
|
|
||||||
- void b() const
|
|
||||||
- static inst liefereIdStat()
|
|
||||||
## protected
|
|
||||||
- string s
|
|
||||||
- void info(const string& text) const
|
|
||||||
## private
|
|
||||||
- int id;
|
|
||||||
- static int idStat = 0
|
|
||||||
## Wie so Sachen funktionieren
|
|
||||||
idStat started mit Null, und für jedes B Object wird die aktuelle idStat um eins addiert gegeben.
|
|
||||||
info wird von jeder Funktion zurückgegeben und gibt:
|
|
||||||
"id: *Name der Funktion* s"
|
|
||||||
aus
|
|
||||||
void B::a(): s += 1 (s ist ein String), info das B::a() aufgerufen wurde
|
|
||||||
void B::b() hat zwei Versionen, *virtual void ()* und *void b() const*
|
|
||||||
- virtual b(): s +=2 , info B::b()
|
|
||||||
- b() const: info B::b() const
|
|
||||||
static int liefereIdStat() gibt idStat aus
|
|
||||||
Konstruktor:
|
|
||||||
- s fängt immer als leerer string an ""
|
|
||||||
- id wird wie oben erwähnt gemacht
|
|
||||||
- info das B() ausgeführt wurde
|
|
||||||
Destruktor:
|
|
||||||
- info mit "~B()"
|
|
||||||
# Klasse C
|
|
||||||
## public
|
|
||||||
- Konstruktor
|
|
||||||
- virtual destuktor
|
|
||||||
- void a()
|
|
||||||
- void b()
|
|
||||||
## Wie so funktioniert
|
|
||||||
- Konstruktor ruft Konstruktor von B auf, mit "C" (bin mir aber nicht ganz sicher ob das das in B Konstuktor überschreibt, wahrscheinlich ja), dannach noch info mit "C()"
|
|
||||||
- Destruktor ruft nur info mit "~C()" auf
|
|
||||||
- void C::a(): s += 3 , info C::a()
|
|
||||||
- void b(): s += 3, info "C::a()"
|
|
||||||
|
|
||||||
# Ablauf inf main()
|
|
||||||
erzeugt ein A object und ruft a() (sollte nichts passieren)
|
|
||||||
gibt vvv aus und holt sich IdStat
|
|
||||||
erzeugt b, ruft b() auf (hätte auf virtual getippt)
|
|
||||||
gitb www aus, liefert IdStat
|
|
||||||
Erzeugt ein Array von C zeigern der Größe 2
|
|
||||||
beide werden mit neuen C gefüllt (erhöht idStat)
|
|
||||||
c[0] ruft a() auf
|
|
||||||
c[1] ruft b() auf
|
|
||||||
beide Objecte werden gelöscht
|
|
||||||
ein const c object wird erstell (++idStat)
|
|
||||||
gibt xxx + IdStat aus
|
|
||||||
Zeiger auf ein A object wird einen neuen C object zugeordnet
|
|
||||||
a() wird aufgerufen
|
|
||||||
object wird gelöscht
|
|
||||||
gibt yyy + IdStat aus
|
|
||||||
Zeiger auf ein B object wird mit neuen C object gefüllt
|
|
||||||
a() wird aufgerufen
|
|
||||||
b() wird aufgerufen
|
|
||||||
object wird gelöscht
|
|
||||||
gibt zzz + IdStat aus
|
|
||||||
|
|
||||||
# Ausgabe
|
|
||||||
**Was ich denke:**
|
|
||||||
```
|
|
||||||
vvv 0
|
|
||||||
1: B::b() 2
|
|
||||||
www 1
|
|
||||||
2: C() C
|
|
||||||
3: C() C
|
|
||||||
2: C::a() C3
|
|
||||||
3: C::b() C4
|
|
||||||
2: ~C() C3
|
|
||||||
3: ~C() C4
|
|
||||||
4: C() C
|
|
||||||
xxx 4
|
|
||||||
5: C() C
|
|
||||||
5: ~C() C
|
|
||||||
yyy 5
|
|
||||||
6: C() C
|
|
||||||
6: B::a() C1
|
|
||||||
6: C::b() C14
|
|
||||||
6: ~C() C14
|
|
||||||
zzz 5
|
|
||||||
1: ~B() 2
|
|
||||||
4: ~C() C
|
|
||||||
```
|
|
||||||
**Was rauskommt:**
|
|
||||||
```
|
|
||||||
vvv 0
|
|
||||||
1: B()
|
|
||||||
1: B::b() 2
|
|
||||||
www 1
|
|
||||||
2: B() C
|
|
||||||
2: C() C
|
|
||||||
3: B() C
|
|
||||||
3: C() C
|
|
||||||
2: C::a() C3
|
|
||||||
3: C::b() C4
|
|
||||||
2: ~C() C3
|
|
||||||
2: ~B() C3
|
|
||||||
3: ~C() C4
|
|
||||||
3: ~B() C4
|
|
||||||
4: B() C
|
|
||||||
4: C() C
|
|
||||||
xxx 4
|
|
||||||
5: B() C
|
|
||||||
5: C() C
|
|
||||||
yyy 5
|
|
||||||
6: B() C
|
|
||||||
6: C() C
|
|
||||||
6: B::a() C1
|
|
||||||
6: C::b() C14
|
|
||||||
6: ~C() C14
|
|
||||||
6: ~B() C14
|
|
||||||
zzz 6
|
|
||||||
4: ~C() C
|
|
||||||
4: ~B() C
|
|
||||||
1: ~B() 2
|
|
||||||
```
|
|
||||||
# Was waren meine Fehler?
|
|
||||||
Ich hab vergessen, das mit jeden C Objekt auch den B Konstruktor aufgerufen wird
|
|
||||||
Nach xxx 4 hatte ich gedacht, der Destuktor von C wird aufgerufen, aber eigentlich wird der Destuktor von A aufgerufen.
|
|
||||||
Ich hab die Reihenfolge, mit der die Objekte nach zzz 6 gelöscht werden vertauscht.
|
|
||||||
Binary file not shown.
@ -1,106 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
class A
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual void a() {}
|
|
||||||
virtual ~A() = default;
|
|
||||||
};
|
|
||||||
|
|
||||||
class B : public A
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
B(string s="")
|
|
||||||
{
|
|
||||||
id = ++idStat;
|
|
||||||
this->s = s;
|
|
||||||
info("B()");
|
|
||||||
}
|
|
||||||
virtual ~B()
|
|
||||||
{
|
|
||||||
info("~B()");
|
|
||||||
}
|
|
||||||
void a()
|
|
||||||
{
|
|
||||||
s += "1";
|
|
||||||
info("B::a()");
|
|
||||||
}
|
|
||||||
void b()
|
|
||||||
{
|
|
||||||
s += "2";
|
|
||||||
info("B::b()");
|
|
||||||
}
|
|
||||||
void b() const
|
|
||||||
{
|
|
||||||
info("B::b() const");
|
|
||||||
}
|
|
||||||
static int liefereIdStat()
|
|
||||||
{
|
|
||||||
return idStat;
|
|
||||||
}
|
|
||||||
protected:
|
|
||||||
string s;
|
|
||||||
void info(const string& text) const
|
|
||||||
{
|
|
||||||
cout << id << ": " << text << " " << s << endl;
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
int id;
|
|
||||||
static int idStat;
|
|
||||||
};
|
|
||||||
|
|
||||||
int B::idStat = 0;
|
|
||||||
|
|
||||||
class C : public B
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
C() : B("C")
|
|
||||||
{
|
|
||||||
info("C()");
|
|
||||||
}
|
|
||||||
virtual ~C()
|
|
||||||
{
|
|
||||||
info("~C()");
|
|
||||||
}
|
|
||||||
void a()
|
|
||||||
{
|
|
||||||
s += "3";
|
|
||||||
info("C::a()");
|
|
||||||
}
|
|
||||||
void b()
|
|
||||||
{
|
|
||||||
s += "4";
|
|
||||||
info("C::b()");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
A a;
|
|
||||||
a.a();
|
|
||||||
cout << "vvv " << B::liefereIdStat() << endl;
|
|
||||||
B const b;
|
|
||||||
b.b();
|
|
||||||
cout << "www " << b.liefereIdStat() << endl;
|
|
||||||
C* c[2];
|
|
||||||
c[0] = new C;
|
|
||||||
c[1] = new C;
|
|
||||||
c[0]->a();
|
|
||||||
c[1]->b();
|
|
||||||
delete c[0];
|
|
||||||
delete c[1];
|
|
||||||
const C c2;
|
|
||||||
cout << "xxx " << C::liefereIdStat() << endl;
|
|
||||||
A* ac = new C;
|
|
||||||
ac->a();
|
|
||||||
delete ac;
|
|
||||||
cout << "yyy " << B::liefereIdStat() << endl;
|
|
||||||
B* bc = new C;
|
|
||||||
bc->a();
|
|
||||||
bc->b();
|
|
||||||
delete bc;
|
|
||||||
cout << "zzz " << B::liefereIdStat() << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user