有一种技术叫Member Spy(类成员间谍),通过该技术派生类可将基类的protected成员修改为public权限。这种技术用到了using关键字。举例如下:
class A
{
protected:
int m_data;
};
class SpyA : public A
{
public:
using A::m_data;
};
void TestSpy(A* pA)
{
SpyA* pSpyA = static_cast<SpyA*>(pA);
// 强制转换A为SpyA,这要求SpyA没有成员变量且没有重载A中的虚函数。
// 现在你可以通过pSpyA访问m_data了。例如:int data = pSpyA->m_data;
}
由于这种技术用到了强制类型转换,当谨慎使用。
示例程序:
#include<iostream>
using namespace std;
class A
{
protected:
int m_data;
public:
A():m_data(55){}
};
class SpyA : public A
{
public:
using A::m_data;
};
void TestSpy(A* pA)
{
SpyA* sa=static_cast<SpyA*>(pA);
cout<<sa->m_data<<endl;
}
int main()
{
A*a=new A();
TestSpy(a);
return 0;
}