我不能在我的基类中调用protected函数.为什么?它看起来像这样:
class B : B2 { public: virtual f1(B*)=0; protected: virtual f2(B*) { codehere(); } } class D : public B { public: virtual f1(B*b) { return f2(b); } protected: virtual f2(B*b) { return b->f2(this); } }
在msvc中我得到错误错误C2248:'name :: class :: f2':无法访问类'name :: class'中声明的受保护成员
在gcc中我得到错误:'virtual int name :: class :: f2()'受到保护.
这是为什么?我认为受保护成员的要点是派生类调用.
受保护的成员函数只能在基类内或其派生类中调用.你不能在课外打电话给他们.外部调用意味着调用类类型变量的成员函数.
所以
virtual f1(B*b) { return f2(b); }
没关系,因为f2对类本身进行操作.(在里面叫)
但
virtual f2(B*b) { return b->f2(this); }
不会编译,因为f2操作b而不是D类本身.(外面叫)这是非法的.
要解决它B:f2应该是公开的.