【问题标题】:Visual Studio 2010 debugger doesn't show values when using multiple inheritance使用多重继承时,Visual Studio 2010 调试器不显示值
【发布时间】:2010-12-13 12:06:29
【问题描述】:

在我的应用程序中,我有一个类,我需要为其保留一组应用程序提供的接口。

由于类本身并不知道所有可能的接口,它不能简单地为每个接口保留一个数据成员。相反,它应该保留一个接口向量。

实际上,这意味着我定义了一个“通用”接口 (IGeneric),所有更具体的接口都继承了该接口。这样,我可以轻松地为所有接口保留一个向量(在后面的代码中,我将实际接口名称替换为一些虚拟名称;在我的应用程序中,这些名称更有意义):

#include <vector>
#include <windows.h>

class IGeneric
   {
   public:
      virtual ~IGeneric() {}
   };

class IFirst : public IGeneric {public: virtual void one() = 0;};
class ISecond : public IGeneric {public: virtual void two() = 0;};
class IThird : public IGeneric {public: virtual void three() = 0;};
class IFourth : public IGeneric {public: virtual void four() = 0;};

typedef std::vector<IGeneric *> GenericContainer;

为了安装接口,其他模块(真正知道所有接口)提供安装接口的功能。它们可能是这样的:

void installFirst (GenericContainer &bc, IFirst &b) { bc.push_back(&b); }
void installSecond (GenericContainer &bc, ISecond &b) { bc.push_back(&b); }
void installThird (GenericContainer &bc, IThird &b) { bc.push_back(&b); }
void installFourth (GenericContainer &bc, IFourth &b) { bc.push_back(&b); }

实际上,应用程序将编写实现多个这些接口的类,如下所示:

class DoAll : public IFirst, public ISecond, public IThird, public IFourth
   {
   public:
      virtual void one() {}
      virtual void two() {}
      virtual void three() {}
      virtual void four() {}
      DoAll(int i) : m_i(i) {}
   private:
      int   m_i;

};

现在安装这个实现真的很容易。这是我的示例中的主要例程:

int main() { 通用容器 gc;

全部执行 (123);

installFirst(gc,all); installSecond(gc,all); installThird(gc,all); installFourth(gc,all);

调试中断(); }

在断点处,我现在在调试器中调查向量的内容。它看起来像这样:

如您所见,它显示了接口的实现是 DoAll(在所有 4 种情况下),它甚至显示了哪个接口(IFirst,ISecond,...)DoAll 已安装在向量中。

问题是调试器似乎无法显示最派生类 (DoAll) 的内容。显示数据成员m_i,但无法显示m_i的值。

只有当我明确地取第一个接口地址,并将其转换为“DoAll *”时,我才能正确看到内容:

我使用以下命令进行编译和链接:

cl /c /EHsc /GR /Zi /Od test.cpp
link /debug test.obj

这是 Visual Studio 2010 中的错误还是我遗漏了什么?

编辑:

如果我使用单继承,比如在这个类中:

class DoFirst : public IFirst
   {
   public:
      virtual void one() {}
      DoFirst(int i) : m_i(i) {}
   private:
      int m_i;
   };

并像这样将其安装在向量中:

DoFirst f (456);
installFirst (gc,f);

调试器向我显示正确的值,并立即显示派生最多的类:

【问题讨论】:

    标签: debugging visual-studio-2010 multiple-inheritance


    【解决方案1】:

    在向量中,您持有指向 IGeneric 的指针。 IGeneric 没有任何关于 m_i 的线索,它是 DoAll 的成员。我们甚至可以说确实存在错误,因为调试器显示 {m_i = ???},但它不应该。

    【讨论】:

    • 当使用单继承时(例如,如果我添加一个仅从 IFirst 继承的 DoFirst 类,并使用 installFirst 将其添加到向量中),调试器会立即向我显示派生最多的类及其内容。只有多重继承才会出错。看起来 Visual Studio 试图通过立即显示派生最多的类来简化调试开发人员,但在使用多重继承时它不起作用。
    • 因此我们可能会得出结论,这是调试器的设计半功能,而不是错误。我怀疑它是否真的被记录在案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多