#include <iostream>
struct Base; struct Derived; // First case: Base is protected.
struct B; struct D; // Second case: Function is protected.
// -----
// Base is protected.
struct Base {
void func( ) { std:: cout << "Hi.\n " ; }
} ;
struct Derived : protected Base {
void heya( ) { std:: cout << "Direct call says: " ; return func( ) ; }
void ahey( ) {
static Derived* ptr = this ;
std:: cout << "Through static pointer says: " ;
return ptr- > func( ) ;
}
} ;
// -----
// Function is protected.
struct B {
protected :
void func( ) { std:: cout << ".iH\n " ; }
} ;
struct D : public B {
void heya( ) { std:: cout << "Direct call says: " ; return func( ) ; }
void ahey( ) {
static D* ptr = this ;
std:: cout << "Through static pointer says: " ;
return ptr- > func( ) ;
}
} ;
// -----
int main( ) {
// Base is protected.
Derived der;
der.heya ( ) ;
der.ahey ( ) ;
// -----
// Function is protected.
D d;
d.heya ( ) ;
d.ahey ( ) ;
// -----
// Through a different instance?
Derived{ } .ahey ( ) ;
D{ } .ahey ( ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEJhc2U7IHN0cnVjdCBEZXJpdmVkOyAvLyBGaXJzdCBjYXNlOiBCYXNlIGlzIHByb3RlY3RlZC4Kc3RydWN0IEI7IHN0cnVjdCBEOyAgICAgICAgICAvLyBTZWNvbmQgY2FzZTogRnVuY3Rpb24gaXMgcHJvdGVjdGVkLgoKLy8gLS0tLS0KCi8vIEJhc2UgaXMgcHJvdGVjdGVkLgpzdHJ1Y3QgQmFzZSB7CiAgICB2b2lkIGZ1bmMoKSB7IHN0ZDo6Y291dCA8PCAiSGkuXG4iOyB9Cn07CgpzdHJ1Y3QgRGVyaXZlZCA6IHByb3RlY3RlZCBCYXNlIHsKICAgIHZvaWQgaGV5YSgpIHsgc3RkOjpjb3V0IDw8ICJEaXJlY3QgY2FsbCBzYXlzOiAiOyByZXR1cm4gZnVuYygpOyB9CiAgICAKICAgIHZvaWQgYWhleSgpIHsKICAgICAgICBzdGF0aWMgRGVyaXZlZCogcHRyID0gdGhpczsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlRocm91Z2ggc3RhdGljIHBvaW50ZXIgc2F5czogIjsKICAgICAgICByZXR1cm4gcHRyLT5mdW5jKCk7CiAgICB9Cn07CgovLyAtLS0tLQoKLy8gRnVuY3Rpb24gaXMgcHJvdGVjdGVkLgpzdHJ1Y3QgQiB7CiAgcHJvdGVjdGVkOgogICAgdm9pZCBmdW5jKCkgeyBzdGQ6OmNvdXQgPDwgIi5pSFxuIjsgfQp9OwoKc3RydWN0IEQgOiBwdWJsaWMgQiB7CiAgICB2b2lkIGhleWEoKSB7IHN0ZDo6Y291dCA8PCAiRGlyZWN0IGNhbGwgc2F5czogIjsgcmV0dXJuIGZ1bmMoKTsgfQogICAgCiAgICB2b2lkIGFoZXkoKSB7CiAgICAgICAgc3RhdGljIEQqIHB0ciA9IHRoaXM7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJUaHJvdWdoIHN0YXRpYyBwb2ludGVyIHNheXM6ICI7CiAgICAgICAgcmV0dXJuIHB0ci0+ZnVuYygpOwogICAgfQp9OwoKLy8gLS0tLS0KCmludCBtYWluKCkgewogICAgLy8gQmFzZSBpcyBwcm90ZWN0ZWQuCiAgICBEZXJpdmVkIGRlcjsKICAgIAogICAgZGVyLmhleWEoKTsKICAgIGRlci5haGV5KCk7CiAgICAKICAgIC8vIC0tLS0tCiAgICAKICAgIC8vIEZ1bmN0aW9uIGlzIHByb3RlY3RlZC4KICAgIEQgZDsKICAgIAogICAgZC5oZXlhKCk7CiAgICBkLmFoZXkoKTsKICAgIAogICAgLy8gLS0tLS0KICAgIAogICAgLy8gVGhyb3VnaCBhIGRpZmZlcmVudCBpbnN0YW5jZT8KICAgIERlcml2ZWR7fS5haGV5KCk7CiAgICBEe30uYWhleSgpOwp9