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