pa==pb,两个指针相等比较的是什么?该如何处理

pa==pb,两个指针相等比较的是什么?
#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
//#include <vld.h>
using namespace std;

class A
{
public:
int a;
};

class B : public A
{
public:
int b;
virtual void func() {}
};

class C : public B
{
public:
int c;
};

void main()
{
C mc;
C *pc = &mc;
B *pb = pc;
A *pa = pc;

printf("%p\n", pc);
printf("%p\n", pb);
printf("%p\n", pa);

if (pc == pa)
printf("pc == pa\n");
if (pb == pc)
printf("pb == pc\n");

if ((void *)pc == (void *)pa)
printf("pc == pa, void\n");
if ((void *)pb == (void *)pc)
printf("pb == pc, void\n");
}


pa==pb,两个指针相等比较的是什么?该如何处理

问题是:为什么if(pc == pb) 会判断为真 ?由pb和pc 的printf结果可以看出,它们的值是不同的,为什么这个判断是真呢?
如果强制转换为void *再进行判断,那么比较的结果就是假了。是否 ==运算符 对于这种类型的指针(继承体系下基类和派生类的指针)运算会进行类型隐式转换呢?

ps:从实现角度来看,由于有虚函数,class C所占内存的首部是vptr,然后才是class B的内容,然后才是class C自己的成员。对于class B,其会包含class A。 所以,A *pa = pc; pa的值会比pc要大4(偏移一个vptr的大小)。
------解决方案--------------------
if (pb == pc)
比较的其实是
if ((void*)pb == (void*)static_cast<B*>(pc))
没什么问题
比较符号的两边不管是C还是C++中都是先将两边隐式转换成同一类型(这种类型叫公共类型)后再比较。
char a = 'a';
short b = 0;
a==b就是先都提升成int后再比较
对于继承类的情况,因为派生类按继承规则也是一个基类('is-a'关系),所以将派生类隐式转换成基类

------解决方案--------------------
pa==pb,两个指针相等比较的是什么?该如何处理
------解决方案--------------------
C++里指针的比较不是简单的数值的比较,在比较之前会转换成相同的类型,在有虚函数或者多重继承的情况下,指针类型的转换会带来数值上的不同。

但是都符合标准上的描述:
Pointers of the same type
(after pointer conversions) can be compared for equality. Two pointers of the same type compare equal if
and only if they are both null, both point to the same function, or both represent the same address

这个例子说的挺好!
http://*.com/questions/18272909/pointer-values-are-different-but-they-compare-equal-why