为什么派生类在被模板化时不被允许访问其受保护的基类成员?
class MyBase {
protected:
int foo;
};
template<typename Impl>
class Derived : public Impl {
public:
int getfoo() {
return static_cast<Impl*>(this)->foo;
}
};
编译器抱怨foo受到保护。为什么呢?
error: int MyBase::foo is protected
答案 0 :(得分:11)
您通过foo
而不是MyBase*
访问Derived<MyBase>*
。您只能通过自己的类型访问受保护的成员,而不能通过基本类型访问。
请改为尝试:
int getfoo() {
return this->foo;
}
从C ++ 2003标准,11.5 / 1 [class.protected]
:“当派生类的朋友或成员函数引用受保护的非静态成员函数或
受保护的基类的非静态数据成员...访问必须通过a
指向派生类本身(或从该类派生的任何类)的指针,引用或对象“