我有一个提供对象的外部组件,比如说 A。在代码的某个地方我有这个:
A *p;
ObjContainer *pBigOne;
...
p = pBigOne->GetAPointerToSomethinOfTypeA();
现在,在 A 内部,有一个我想调用的受保护方法(让我们发挥一些想象力,假设它被命名为 ProtectedMethod()),但显然我不能。为了解决这个问题,我编写了一个 B 类,如下所示:
// B.h
class B : class A
{
public:
B();
~B();
bool MyMethodIWantToCall();
}
// B.cpp
B::B(){}
B::~B(){}
bool B::MyMethodIWantToCall()
{
return ProtectedMethod();
}
更改上面的代码:
B *p;
ObjContainer *pBigOne;
...
p = (B *)pBigOne->GetAPointerToSomethinOfTypeA(); // (*)
p->MyMethodIWantToCall();
我能够得到我想要的东西,但是一位同事向我指出,这可能会导致一些严重的内存错误,因为 B 大于 A。为了确认这一点,我们向 B 添加了一个成员,将其初始化为用VS2010手表检查了一些东西。在 VS2005 中,未初始化的变量以 84** 的值开头...,这里我们得到了一个非常随机的变量。
所以,我有两个问题:1)当我在(*)时,为什么我必须投?不应该是同一类型吗?2)我的解决方法绝对安全吗?
编辑
3)有没有最安全的方法来做到这一点?