Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于C++;接口(纯虚拟类)/多重继承/虚拟继承_C++_Interface_Multiple Inheritance_Virtual Inheritance_Pure Virtual - Fatal编程技术网

C++ 关于C++;接口(纯虚拟类)/多重继承/虚拟继承

C++ 关于C++;接口(纯虚拟类)/多重继承/虚拟继承,c++,interface,multiple-inheritance,virtual-inheritance,pure-virtual,C++,Interface,Multiple Inheritance,Virtual Inheritance,Pure Virtual,我想重建我的小型3d引擎,它非常小,所以我只在一个项目中放置所有文件。 现在,我想用接口重建它,这样我就可以将不同的模块分散到不同的项目中,并将它们构建为dll。 当我这样做的时候,我在框架代码的基本设计中遇到了很多困难。 我想为我的小引擎设计一个“对象层次结构”,它是在前面的工作中实现的。例如: Object Component SceneComponent StaticMeshComponent/SkelMeshComponent D3DSkelComponent ... 但它们是直接实

我想重建我的小型3d引擎,它非常小,所以我只在一个项目中放置所有文件。 现在,我想用接口重建它,这样我就可以将不同的模块分散到不同的项目中,并将它们构建为dll。 当我这样做的时候,我在框架代码的基本设计中遇到了很多困难。 我想为我的小引擎设计一个“对象层次结构”,它是在前面的工作中实现的。例如:

Object
Component
SceneComponent
StaticMeshComponent/SkelMeshComponent
D3DSkelComponent 
...
但它们是直接实现的。 现在,我想使用接口(纯虚拟类),我已经设计了基本接口(用于测试):

但我有两个IOObject基类,所以我必须将所有“public xxx”更改为“virtual public xxx”,这看起来很糟糕。 另一个问题是CStaticMesh必须实现IStaticMesh的所有虚拟成员功能,包括:

virtual void Draw() = 0;
virtual void BuildSomeMesh() = 0;
即使CMesh中存在平局,这是CStaticMesh的基本调用。 好的,也许我需要一个TMesh:

template < typename TBase >
class TMesh : public TObject< TBase >
{
public:
    virtual void Draw()
    {
        cout<<"draw mesh" <<endl;
    }
};
模板
TMesh类:公共对象
{
公众:
虚空绘制()
{

cout您可以通过虚拟继承来解决这个问题。这将在层次结构中只创建一个多重继承接口类的实例

首先是接口:

class IObject
{
public:
    virtual std::string GetName() = 0;
};

class IMesh : virtual public IObject
{
public:
    virtual void Draw() = 0;
};

class IStaticMesh : virtual public IMesh
{
public:    
    virtual void BuildSomeMesh() = 0;
};

class ISkeletalMesh : virtual public IMesh
{
public:
    virtual void PlayAnim( const std::string& strAnimName ) = 0;
};

class ID3DSkeletalMesh : virtual public ISkeletalMesh
{
public:
    virtual void LoadD3D( const std::string& strD3D ) = 0;
};
然后实现:

class CObject : virtual public IObject
{
public:
    std::string GetName()
    {
        return m_strTest;
    }

    std::string m_strTest;
};

class CMesh : public CObject, virtual public IMesh
{
public:
    void Draw()
    {
        cout<<"draw mesh" <<endl;
    }
};

class CStaticMesh : public CMesh, virtual public IStaticMesh
{
public:
    void BuildSomeMesh()
    {
        cout<<"Build Some Mesh!"<<endl;
    }    
};
...
class-CObject:虚拟公共对象
{
公众:
std::string GetName()
{
返回m_strTest;
}
std::字符串m_strTest;
};
CMesh类:公共对象、虚拟公共IMesh
{
公众:
作废提款()
{
库特
virtual void Draw() = 0;
virtual void BuildSomeMesh() = 0;
template < typename TBase >
class TMesh : public TObject< TBase >
{
public:
    virtual void Draw()
    {
        cout<<"draw mesh" <<endl;
    }
};
class CStaticMesh : public TMesh<IStaticMesh>
{
public:
    virtual void BuildSomeMesh()
    {
        cout<<"Build Some Mesh!"<<endl;
    }
};
class IObject
{
public:
    virtual std::string GetName() = 0;
};

class IMesh : virtual public IObject
{
public:
    virtual void Draw() = 0;
};

class IStaticMesh : virtual public IMesh
{
public:    
    virtual void BuildSomeMesh() = 0;
};

class ISkeletalMesh : virtual public IMesh
{
public:
    virtual void PlayAnim( const std::string& strAnimName ) = 0;
};

class ID3DSkeletalMesh : virtual public ISkeletalMesh
{
public:
    virtual void LoadD3D( const std::string& strD3D ) = 0;
};
class CObject : virtual public IObject
{
public:
    std::string GetName()
    {
        return m_strTest;
    }

    std::string m_strTest;
};

class CMesh : public CObject, virtual public IMesh
{
public:
    void Draw()
    {
        cout<<"draw mesh" <<endl;
    }
};

class CStaticMesh : public CMesh, virtual public IStaticMesh
{
public:
    void BuildSomeMesh()
    {
        cout<<"Build Some Mesh!"<<endl;
    }    
};
...