【发布时间】: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