比如有三个类,它们的关系如下:
class MyClassA
{
public:
    virtual ~MyClassA(void){}
};class MyClassB
{
public:
    virtual ~MyClassB(void){}
};class MyClassC
: public MyClassA
, public MyClassB
{
};MyClassC c;

MyClassA *pa = &c;
MyClassB *pb = &c;
MyClassC *pc = &c;此时, 我在VC里跟踪时, pa == pc, pb != pc
有没办法通过pb来获取对象的实际地址, 即pc,当基类有虚析构函数时, 通过基类的指针删除派生类能正常清理对象,
说明通过pb应该能得到pb指向的对象其实是一个MyClassC,至少编译器有办法知道
不知道通过程序能不能判断出来,pb指向的实际对象

解决方案 »

  1.   

    其实我不需要知道pb是不是指向的是一个pc,
    我只想通过pb的指针得到pb指向的对象的实际地址(即内存中对象模型的起始地址pc)
      

  2.   

    pa会等于pc?不可能吧?
    pa,pb,pc是三个不同的指针变量,都会有自己的地址,相等的应该是他们的变量值吧:
    *pa=*pc。
      

  3.   

    楼上的兄弟咬文嚼字呢,而且
    *pa 怎么会等于 *pc, 一个是MyClassA的引用, 一个是MyClassC的引用,
    不同类型的没实现==号操作咋比较呢。
    的确是pa == pc,两个指针相等。
      

  4.   

    pc 其实相当于对象 pa和 pb 绑到一起的 ,只不过pa绑到了开头,pb绑到了后面,所以
    sizeof(*pc)=sizeof(*pa)+sizeof(*pb);
    要想通过pb得到 实际地址 只要 pb 减去 pa 的大小就行了,不过要把指针先转换成int格式才行。using namespace std;
    class MyClassA
    {
    public:
      virtual ~MyClassA(void){}
    };class MyClassB
    {
    public:
      virtual ~MyClassB(void){}
    };class MyClassC: public MyClassA, public MyClassB
    {
    };
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    MyClassC c;

    MyClassA *pa = &c;
    MyClassB *pb = &c;
    MyClassC *pc = &c;
    cout<<"pa:"<<pa<<"  "<<sizeof(MyClassA)<<endl;
    cout<<"pb:"<<pb<<"  "<<sizeof(MyClassB)<<endl;
    cout<<"pc:"<<pc<<"  "<<sizeof(MyClassC)<<endl;
    int ppb=(int)pb;
    ppb-=sizeof(MyClassA);
    cout<<"现在pb转换后的地址  "<<(int * )ppb<<endl;
    return 0;
    }
      

  5.   

    楼上的朋友,你说的情况是其实你已经知道了pa指向的是一个MyClassC吧。
    那样用dynamic_cast之类的就搞定了。俺的情况是pa不确定是指向一个MyClassA还是MyClassC
    要在运行时判断。
      

  6.   

    楼主可以用 RTTI 加以判断的,看看 pa实际指向的对象,然后 再处理。