基类和派生类之间的调试器-pointeraddress不同

时间:2017-10-06 07:00:53

标签: c++ debugging pointers

鉴于,B类是基类,D类是从B派生的。 使用VS-Debugger - 如果你有一个指向D类实例的指针 - 我们的定义也是指向B类的指针,所以你可以使用它 - 这些指针显示略有不同?

# pseudo-code:
B *pB = new D();
D *pD = (D*) pB;
# why is: pb != pD

3 个答案:

答案 0 :(得分:0)

这个概念叫做别名。 D pD =(D )pB; 在这里,无论你是否正在施放它,你都要将pd分配给pb。您没有创建新对象。地址会相同,位置上的对象已经改变,位置仍然是相同的。

想象一下,在您当前的地址构建一个新家,您的地址仍将保持不变。 因此,如果比较这两个指针,它们将指向相同的地址。

答案 1 :(得分:0)

没有什么是标准的要求。只需要在基类指针和派生类之间转发和返回时获得相同的值:

B *pB = new D();
D *pD = (D*) pB;
B *pB2 = (B*) pD;
// pB2 == pB is guaranteed per C++ standard
// but nothing is required between pB and pD

只要涉及虚拟方法及其关联的vTable,实现通常会为派生类指针和基类使用不同的指针地址。

答案 2 :(得分:0)

因为标准并没有说它们应该是相同的。

主要动机显然是多重继承。一个类可以从多个基类派生,所以很明显你不能强制派生子对象的开头与基类的开头相同,因为可能有多个基类。