2

为什么派生类在模板化时不允许访问其受保护的基类成员?

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
4

1 回答 1

11

您正在foo通过 aMyBase*而不是 a访问Derived<MyBase>*。您只能通过您自己的类型访问受保护的成员,而不是通过基本类型。

试试这个:

int getfoo() {
        return this->foo;
}

从 C++ 2003 标准 11.5/1 开始[class.protected]:“当派生类的朋友或成员函数引用基类的受保护的非静态成员函数或受保护的非静态数据成员时……访问必须通过指向、引用、或派生类本身的对象(或从该类派生的任何类)”

于 2012-04-10T20:02:17.677 回答