考虑以下代码:
#include <iostream>
using std::endl;
using std::cout;
template<typename T>
class B{
protected:
T value;
B* ptr;
public:
B(T t):value(t), ptr(0){}
};
template<typename T>
class D: public B<T>{
public:
void f();
D(T t):B<T>(t){}
};
template<typename T>
void D<T>::f(){
cout << this->value << endl; //OK!
this->ptr = this;
cout << this->ptr->value << endl; //error! cannot access protected member!!
B<T>* a = this;
cout << a->value <<endl; //error! cannot access protected member!!
}
int main(){
D<double> a(1.2);
a.f();
return 0;
}
看来基类的成员可以直接使用this
指针,但不是其他指针。
编译器是否将它们视为不同的实例化?
是的,这是预期的行为。受保护会员 http://en.cppreference.com/w/cpp/language/access#Protected_member_access基类的内容可以在派生类中访问,但只能通过以下类型的对象进行访问:is派生类(或当前派生类的进一步派生类)(包括this
)。这意味着您无法通过指向基类的指针访问受保护的成员。
Base 类的受保护成员只能被访问
1) ...
2) 由任何从 Base 派生的类的成员使用,但仅当
对派生自 Base 的类型的对象进行操作(包括
这)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)