使用指向派生类中的基类的指针访问受基类保护的成员
Access base class protected members using pointers to base class in derived class
请考虑以下代码:
#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
但不能使用其他指针访问。
编译器是否将它们视为不同的实例化?
是的,这是预期行为。基类的受保护成员可以在派生类中访问,但只能通过派生类(或当前派生类的进一步派生类)类型的对象(包括this
)。这意味着无法通过指向基类的指针访问受保护的成员。
只能访问类 Base 的受保护成员
1) ...
2)由从Base派生的任何类的成员,但仅在以下情况下 对派生自 Base 类型的对象进行操作(包括 这)
一个更简单的测试示例:
class Base
{
protected:
int i;
};
class D1 : public Base
{
};
class D2 : public Base
{
int a(Base& b) { return b.i; } // error
int a(D1& d) { return d.i; } // error
int a(D2& d) { return d.i; }
};
在派生类D2
中,我们可以在D2
实例中访问Base::i
,但不能在Base
实例中访问,也不能在派生自Base
的对象中访问D2
而不是通过 。
其他好的[C++参考][受保护]说:
类
Base
的受保护成员可以被派生自Base
的任何类的成员访问,但只有在对派生自Base
(包括this
)类型的对象进行操作时。
上面的测试表明,那里的措辞有点不准确¹ - 它应该读作"仅在对自己类型的对象或从它派生的对象进行操作时"。
¹ 或者 GCC 不正确 - 我们真的应该检查这方面的标准。
相关文章:
- 为什么此派生对象无法访问基类的后递减方法?
- 继承和友元函数,从基类访问受保护的成员
- 无法访问基类函数 C++
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 如何从派生类中的基类访问变量的值?
- 抽象类的需求是什么?为什么要通过其基类访问派生类方法?在C++
- 如何从另一个类的基类访问派生类中的受保护成员
- 尝试从基类访问受保护的构造函数时出现错误 C2248
- 从C++中的基类访问子数据
- 从抽象基类访问另一个基类成员
- 从Derivered类设置值,同时从基类访问相同的值
- 如何使用多态性从基类访问派生类向量成员
- 如何在C++中从基类访问派生类的属性
- 从基类访问联合的公共部分
- (c++)从私有基类访问私有成员变量
- 类的某些成员只能由基类访问吗
- 无法从c++基类访问变量
- C++从基类访问两个类组成中的私有成员
- 基类访问规范与类成员访问规范
- 从基类访问派生类