我注意到C ++模板不允许派生类在不使用this->member
或Base<T>::member
的情况下访问基类的受保护成员。在常规课程中,我可以这样写:
class Base{
public:
Base(){
k = 4;
}
protected:
int k;
};
class Derived : public Base{
public:
void foo(){
std::cout << k << '\n';
}
};
到目前为止没有错误。但是然后,如果我制作了Base
和Derived
类模板,那么我将无法访问k
,而不会更加明确:
template<class T>
class Base{
public:
Base(){
k = 4;
}
protected:
int k;
};
template<class T>
class Derived : public Base<T>{
public:
void foo(){
std::cout << k << '\n'; //error
}
void bar(){
std::cout << this->k << '\n'; //ok
}
void bar2(){
std::cout << Base<T>::k << '\n'; //ok
}
};
那为什么会发生呢?有什么办法解决吗?我有一个项目,在该项目中,我经常访问基类的受保护成员,而我经常需要取消引用this
的事实是a)烦人的输入和b)使代码的可读性降低。