在g ++下编译:
class A
{
protected:
void f(){}
};
class B: public A
{
void g()
{
A a;
f(); //This works
a.f(); //Error: "A::F() is protected"
this->f(); //Works
((A*)this)->f(); //Same error
}
};
在为基类的非此对象调用受保护函数时出错。编译器是GCC - 但是相同的代码在GCC的其他版本下工作。请问是什么 - 因为在调用基类的受保护方法时verboten
,除非是通过this
?
答案 0 :(得分:1)
你从实例A调用函数f()。f()是B的私有函数,所以从B中你可以做类似的事情:
this->f()
但是如果你像你做的那样创建一个新的A实例然后调用它的f(),它就会受到保护。
答案 1 :(得分:1)
您不必通过f
访问this
- 您可以从B
类型的任何对象访问它。例如,这可以在B::g
:
B b;
b.f();
C ++ 03标准说(11.5):
当派生类的朋友或成员函数引用受保护的非静态成员函数或受保护的基类的非静态数据成员时,除了前面第11章中描述的那些之外,还应用访问检查。除非形成指向member(5.3.1),访问必须通过指向,引用或派生类本身的对象(或从该类派生的任何类)
因此,您可以从类型f
或B
派生的对象访问B
- 包括但不限于*this
。
C ++ 11标准包含类似的限制(11.4)