【发布时间】:2010-01-08 02:48:15
【问题描述】:
我在 Visual Studio C++ 2008 中使用指向具有虚拟多重继承的对象的指针调试项目时遇到问题。如果指针是基类型,我无法检查派生类中的字段。
我做的一个简单的测试用例:
class A
{
public:
A() { a = 3; };
virtual ~A() {}
int a;
};
class B : virtual public A
{
public:
B() { b = 6; }
int b;
};
class C : virtual public A
{
public:
C() { c = 9; }
int c;
};
class D : virtual public B, virtual public C
{
public:
D() { d = 12; }
int d;
};
int main(int argc, char **argv)
{
D *pD = new D();
B *pB = dynamic_cast<B*>(pD);
return(0);
}
在“return(0)”处下断点,将pD和pB放在watch窗口中。我想不出办法在监视窗口的 pB 中看到“d”。调试器不接受 C 风格转换或 dynamic_cast。展开到 v-table 表明调试器知道它实际上指向的是 D 析构函数,但无法看到“d”。
从基类定义中删除“虚拟”(所以 D 有 2 个 A),调试器会让我扩展 pB 并看到它确实是一个可以扩展的 D* 对象。这也是我希望在虚拟案例中看到的。
有什么办法可以做到这一点吗?我需要找出对象布局的实际偏移量才能找到它吗?还是说我对虚拟多重继承和重新设计不够聪明,因为实际项目要复杂得多,如果我不能调试,我应该让它更简单:)
【问题讨论】:
-
你可以试试另一个调试器 :) 也许是windbg?
-
项目更新:我重构了我的设计以避免虚拟多重继承。我仍在使用多重继承,但不需要虚拟多重继承。当指针指向中间类(示例中为 C*)时,调试器以相同的方式处理多重继承,因此该解决方案仍然有用。
标签: c++ visual-studio-2008 debugging