C++ 虚拟继承在解组时导致关于一个成员的多个信息

C++ 虚拟继承在解组时导致关于一个成员的多个信息,c++,visual-c++,visual-studio-2012,inheritance,virtual-inheritance,C++,Visual C++,Visual Studio 2012,Inheritance,Virtual Inheritance,我使用虚拟继承 我基本上有一些抽象模块的继承树: class Positionable{ public: virtual std::string getName() = 0; }; class Positionable3D : virtual public Positionable{ public: virtual void setCenter(Point3D &center) = 0; }; class Renderable3D :

我使用虚拟继承

我基本上有一些抽象模块的继承树:

class Positionable{
    public:
        virtual std::string getName() = 0;
};

class Positionable3D : virtual public Positionable{
    public:
        virtual void setCenter(Point3D &center) = 0;
};

class Renderable3D : virtual public Positionable3D{
    public:
        virtual void render() = 0;
};
我使用自己的继承结构编写了它的实现:

class FeyPositionable : virtual public Positionable{
    public:
        virtual std::string getAdditionalInfo() = 0;
};

class FeyPositionable3D 
  : virtual public Positionable3D, virtual public FeyPositionable{

    public:
        virtual void someFun() = 0;
};

class FeyRenderable3D 
  : virtual public Renderable3D, virtual public FeyPositionable3D{
    protected:
        GeometryStructure * structure;

    public:
        virtual void render() = 0;
};
< >但是,当我在Visual C++ 2012中编译并运行时,在调试窗口中,我看到了许多函数和成员的重复,例如:


这只是调试器窗口的问题,还是我有多个方法/成员的副本?如果是这样,它们是否可以有不同的值,例如结构的副本?

好的,因此通过使用虚拟继承,您只能为从Positionable3D或FeyPositionable派生的任何对象创建一个Positionable实例

但是,您还可以使用Renderable3D从Positionable3D虚拟继承,并且可以从类FeyPositionable3D的Positionable3D和FeyPositionable虚拟继承


这意味着,在创建FeyRenderable3D实例时,基于创建的是FeyRenderable3D的可存储实例、Renderable3D和FeyPositionable3D的实例以及它们所有父对象的实例。现在,每次虚拟继承时,您都要确保无论谁从谁继承,都只创建层次结构中每个类的一个实例。总之,您的实现应该没有问题,但是您正在创建一组非常广泛的vtable,其中虚拟指针纵横交错。

您通过多条路径多次从基类派生,所以它们出现了多次。但这会导致程序中的某些方法或成员重复吗?我的意思是,例如,它使用更多的内存来复制?或者它只是导致调试器看起来如此不可读?我应该以某种方式重新构建它还是可以的?您能显示在调试窗口中显示的类的声明吗?我是说,这种类型的声明。它看起来像是从一些FeyModel和其他类继承而来。更正了我的帖子。FeyPositionable3D从我的抽象树继承自Positionable3D,FeyPositionableNot Positionable。我必须有权访问FeyPositionable::getAdditionalInfo和Positionable::getName。此外,您需要确保某个类不是虚拟的,以便可以实际创建它的实例。层次结构中唯一的非虚拟类是FeyRenderable3D,这是一个抽象类,因为函数render=0。因此,这个类也不能被实例化。