C++ 有点意思,时不时就能露出使用者的软肋。老汉又被戏弄了。
有三个类,大致如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class base { protected: void foo() { printf("base::foo()\n"); } }; class sub : public base { }; class sub2 : public sub { public: void bar() { sub* p = this; p->foo(); } }; |
这样写是编译不过去滴,卡在 p->foo() 那儿,说是访问了保护成员,把 sub* 改为 base* 也是不管用的,问题依旧。
怎么办呢?呵呵,看来 C++ 是个文明社会,脱了裤子放屁是不允许的,直接调用 foo() 就可以啦。
什么道理?蜗牛什么的来讲讲?