#include <iostream>
using namespace std;
class KString {
private:
char* mString;
int mLength;
public:
KString(char const* s) {
mLength = strlen(s); // Länge ohne '\0'
mString = new char[mLength + 1]; // + 1 wegen '\0'
strcpy(mString, s); // kopiert s nach mString
}
void setString(char const* s) {
int length = strlen(s);
if (length > mLength) {
delete[] mString;
mString = new char[length + 1];
}
strcpy(mString, s);
mLength = length;
}
char* getString() { return mString; }
int length() { return mLength; }
void print() { cout << mString << endl; }
~KString() {
delete[] mString;
}
};
class KVersalien : public KString {
private:
void up() {
for (int i = 0; i < mLength; ++i) {
if (islower(mString[i])) {
mString[i] = toupper(mString[i]);
}
}
}
public:
KVersalien(char const* s) : mLength(0) { }
void print() { cout << mString << endl; }
void setString(char const* s) {
KString::setString(s);
up();
}
};
int main() {
KString s1{"erster String"};
s1.print();
cout << "s1.length()=" << s1.length() << endl;
return 0;
}
Sichtbarkeit der Vererbung gibt
Obergrenze für Sichtbarkeit vor
#include <iostream>
using namespace std;
class A {
private:
int pi = 3;
protected:
int plank = 6;
public:
int boltzmann = 1;
};
class B : public A {
public:
int getPlank() { return plank; }
int getBoltzmann() { return boltzmann; }
};
int main() {
B b;
cout << "pi = " << b.pi << endl;
cout << "boktzmann = " << b.boltzmann << endl;
cout << "plank = " << b.plank << endl;
return 0;
}
#include <iostream>
using namespace std;
class A {
private:
int pi = 3;
protected:
int plank = 6;
public:
int boltzmann = 1;
};
class B : protected A {
public:
int getPlank() { return plank; }
int getBoltzmann() { return boltzmann; }
};
int main() {
B b;
// Die Ausgabe von B::pi geht nicht, da private.
cout << "boktzmann = " << b.boltzmann << endl;
cout << "plank = " << b.plank << endl;
return 0;
}
#include <iostream>
using namespace std;
class A {
private:
int pi = 3;
protected:
int plank = 6;
public:
int boltzmann = 1;
};
class B : private A {
public:
int getPlank() { return plank; }
int getBoltzmann() { return boltzmann; }
};
int main() {
B b;
// Die Ausgabe von B::pi geht nicht, da private.
cout << "boktzmann = " << b.boltzmann << endl;
cout << "plank = " << b.plank << endl;
return 0;
}
#include <iostream>
using namespace std;
class KString {
protected:
char* mString;
int mLength;
public:
KString(char const* s) {
mLength = strlen(s); // Länge ohne '\0'
mString = new char[mLength + 1]; // + 1 wegen '\0'
strcpy(mString, s); // kopiert s nach mString
}
void setString(char const* s) {
int length = strlen(s);
if (length > mLength) {
delete[] mString;
mString = new char[length + 1];
}
strcpy(mString, s);
mLength = length;
}
char* getString() { return mString; }
int length() { return mLength; }
void print() { cout << mString << endl; }
~KString() {
delete[] mString;
}
};
class KVersalien : public KString {
private:
void up() {
for (int i = 0; i < mLength; ++i) {
if (islower(mString[i])) {
mString[i] = toupper(mString[i]);
}
}
}
public:
KVersalien(char const* s) : KString(s) { up(); }
void print() { cout << mString << endl; }
void setString(char const* s) {
// TODO
}
};
int main() {
KString s1{"erster String"};
s1.print();
cout << "s1.length()=" << s1.length() << endl;
return 0;
}
#include <iostream>
using namespace std;
class KString {
protected:
char* mString;
int mLength;
public:
KString(char const* s) {
mLength = strlen(s); // Länge ohne '\0'
mString = new char[mLength + 1]; // + 1 wegen '\0'
strcpy(mString, s); // kopiert s nach mString
}
void setString(char const* s) {
int length = strlen(s);
if (length > mLength) {
delete[] mString;
mString = new char[length + 1];
}
strcpy(mString, s);
mLength = length;
}
char* getString() { return mString; }
int length() { return mLength; }
void print() { cout << mString << endl; }
~KString() {
delete[] mString;
}
};
class KVersalien : public KString {
private:
void up() {
for (int i = 0; i < mLength; ++i) {
if (islower(mString[i])) {
mString[i] = toupper(mString[i]);
}
}
}
public:
KVersalien(char const* s) : KString(s) { up(); }
void print() { cout << mString << endl; }
void setString(char const* s) { KString::setString(s); up(); }
};
int main() {
KString s1{"erster String"};
s1.print();
cout << "s1.length()=" << s1.length() << endl;
s1.setString("kurz");
s1.print();
cout << "s1.length()=" << s1.length() << endl;
cout << endl;
s1.setString("erster String ueberschrieben");
s1.print();
cout << "s1.length()=" << s1.length() << endl;
cout << endl;
KVersalien v1{s1.getString()};
v1.print();
cout << "v1.length()=" << v1.length() << endl;
cout << endl;
v1.setString("versalien-string auch nochmal ueberschrieben");
v1.print();
cout << "v1.length()=" << v1.length() << endl;
cout << endl;
return 0;
}
#include <iostream>
using namespace std;
class Pferd {
public:
string geraeusch() {
return "wiehern";
}
};
class Mensch {
public:
string geraeusch() {
return "hallo";
}
void print() {
cout << "Ich bin ein Mensch!" << endl;
}
};
class Chimaere : public Mensch, public Pferd {
public:
string geraeusch() {
return Mensch::geraeusch() + Pferd::geraeusch();
}
};
int main() {
Chimaere c;
cout << c.geraeusch() << endl;
cout << c.Mensch::geraeusch() << endl;
cout << c.Pferd::geraeusch() << endl;
c.print();
return 0;
}
Weitergabe von Daten (Attributen) und Operationen (Methoden) an andere Klassen
Wiederverwendung und ggf. Spezialisierung von Programmcode (siehe KVersalien::setString()
)
Syntax: class B : public class A {
Auch Mehrfachvererbung möglich
Sichtbarkeit der Vererbung gibt obere Grenze für die weitere Sichtbarkeit an
class B : public class A {
: Sichtbarkeit aller geerbten Elemente bleibt erhaltenclass B : protected class A {
: Sichtbarkeit aller geerbten Elemente wird auf Unterklassen beschränktclass B : private class A {
: Sichtbarkeit aller geerbten Elemente wird auf diese Klasse beschränktAufruf von Methoden der Oberklasse mit Klassennamen: KString::setString()
Aufruf des Konstruktors der Oberklasse in der Initializer List:
KVersalien(.. s) : KString(s) {}
Aufrufe der Konstruktoren der Oberklassen wird dringend empfohlen
(Betrachtet das Problem eher gesellschaftlich – im Jahr 2024.)
heirateMann()
und heirateFrau
sind nicht mehr zeitgemäßgehePartnerschaftEin()
class Person {
private:
Person *mParterIn;
void gehePartnerschaftEin(Person *p) { mPartnerIn = p; }
/* ... Rest ... */
public:
/* ... Rest ... */
Person* partnerInVon() { return mPartnerIn; }
bool heirate(Person *p) {
if (p == nullptr) {
return false;
}
if (p->partnerInVon() != nullptr ||
this->partnerInVon() != nullptr) {
return false;
}
p->gehePartnerschaftEin(this);
this->gehePartnerschaftEin(p);
return true;
}
};
#include <iostream>
#include <list>
using namespace std;
class A {
public:
void print() { cout << "Hello!" << endl; }
};
class B : public A {
public:
void print() { cout << "Bye!" << endl; }
};
class C : public A {
public:
void print() { cout << "Ciao!" << endl; }
};
int main() {
list<A*> elements;
A a;
B b;
C c1, c2;
elements.push_back(&b);
elements.push_back(&c1);
elements.push_back(&c2);
elements.push_back(&a);
for (A *elem : elements) {
elem->print();
}
return 0;
}
Aufruf der korrekten Variante?
→ virtuelle Methoden
→ Kapitel 11