#include <iostream>
using namespace std;
class Ober {
public:
void f(void) {
std::cout << "f der Oberklasse." << std::endl;
}
void g(void) {
std::cout << "g der Oberklasse." << std::endl;
}
void h(void) {
std::cout << "h der Oberklasse." << std::endl;
}
};
class Unter: public Ober {
public:
void f(void) {
std::cout << "f der Unterklasse." << std::endl;
}
void h(void) {
std::cout << "h der Unterklasse nutzt das ";
Ober::h();
}
};
class AbstrakteOberklasse {
protected:
static const int j = 42;
public:
virtual void i(void) = 0;
};
class KonkreteKlasse: public AbstrakteOberklasse {
public:
void i(void) {
std::cout << "j der Oberklasse ist " << j << std::endl;
}
};
int main() {
Unter unter;
unter.f();
unter.g();
unter.h();
//die folgende Zeile erzeugt die Compiler-Fehlermeldung
// error: cannot declare variable 'geht_nicht' to be of abstract type 'AbstrakteOberklasse'
//AbstrakteOberklasse geht_nicht;
KonkreteKlasse konkret;
konkret.i();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgT2JlciB7CnB1YmxpYzoKCXZvaWQgZih2b2lkKSB7CgkJc3RkOjpjb3V0IDw8ICJmIGRlciBPYmVya2xhc3NlLiIgPDwgc3RkOjplbmRsOwoJfQoJdm9pZCBnKHZvaWQpIHsKCQlzdGQ6OmNvdXQgPDwgImcgZGVyIE9iZXJrbGFzc2UuIiA8PCBzdGQ6OmVuZGw7Cgl9Cgl2b2lkIGgodm9pZCkgewoJCXN0ZDo6Y291dCA8PCAiaCBkZXIgT2JlcmtsYXNzZS4iIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCmNsYXNzIFVudGVyOiBwdWJsaWMgT2JlciB7CnB1YmxpYzoKCXZvaWQgZih2b2lkKSB7CgkJc3RkOjpjb3V0IDw8ICJmIGRlciBVbnRlcmtsYXNzZS4iIDw8IHN0ZDo6ZW5kbDsKCX0KCXZvaWQgaCh2b2lkKSB7CgkJc3RkOjpjb3V0IDw8ICJoIGRlciBVbnRlcmtsYXNzZSBudXR6dCBkYXMgIjsKCQlPYmVyOjpoKCk7Cgl9Cn07CgpjbGFzcyBBYnN0cmFrdGVPYmVya2xhc3NlIHsKcHJvdGVjdGVkOgoJc3RhdGljIGNvbnN0IGludCBqID0gNDI7CnB1YmxpYzoKCXZpcnR1YWwgdm9pZCBpKHZvaWQpID0gMDsKfTsKCmNsYXNzIEtvbmtyZXRlS2xhc3NlOiBwdWJsaWMgQWJzdHJha3RlT2JlcmtsYXNzZSB7CnB1YmxpYzoKCXZvaWQgaSh2b2lkKSB7CgkJc3RkOjpjb3V0IDw8ICJqIGRlciBPYmVya2xhc3NlIGlzdCAiIDw8IGogPDwgc3RkOjplbmRsOwoJfQp9OwoKaW50IG1haW4oKSB7CglVbnRlciB1bnRlcjsKCXVudGVyLmYoKTsKCXVudGVyLmcoKTsKCXVudGVyLmgoKTsKCS8vZGllIGZvbGdlbmRlIFplaWxlIGVyemV1Z3QgZGllIENvbXBpbGVyLUZlaGxlcm1lbGR1bmcKCS8vCQllcnJvcjogY2Fubm90IGRlY2xhcmUgdmFyaWFibGUgJ2dlaHRfbmljaHQnIHRvIGJlIG9mIGFic3RyYWN0IHR5cGUgJ0Fic3RyYWt0ZU9iZXJrbGFzc2UnCgkvL0Fic3RyYWt0ZU9iZXJrbGFzc2UgZ2VodF9uaWNodDsKCUtvbmtyZXRlS2xhc3NlIGtvbmtyZXQ7Cglrb25rcmV0LmkoKTsKCXJldHVybiAwOwp9