我想拥有从虚拟类(例如,MAP)继承的类(例如,ATLAS),因此可以在ATLAS的构造函数中指定MAP的一个特化(例如, physicalMap或politicalMap)。我想知道C ++是否可行?
class map {...};
class physicalMap: public virtual map {...};
class politicalMap: public virtual map {...};
class atlas: public virtual map {
atlas(int i): physicalMap(){...}
atlas(inti, int j): politicalMap(){...}
...
};
如何指定我想要的专业化?
答案 0 :(得分:1)
你不能将构造函数委托给姐妹" (继承相同基类的类)类构造函数。
但是使用模板,您可以从模板参数继承并执行类似的操作:
Window
答案 1 :(得分:0)
您不需要虚拟继承。您可以考虑使用模板元编程,其中您可以将类类型本身作为模板类型参数传递。
示例:强>
template<typename TargetClass>
class Map
{
// Work with TargetClass
// This class and the "target" class would know each other well
// in terms of what methods/variables are there in target class.
};
class PhysicalMap : Map<PhysicalMap>
{};
class PoliticalMap : Map<PoliticalMap>
{};
我已跳过Atlas
以保持简单(且易于理解)。如果您需要Atlas
,则可以跳过这两个中间类(继承自Map<>
),并以这种方式实例化PhysicalMap
和PoliticalMap
。
class PoliticalMap; // non-templated
class PhysicalMap;
class Atlas
{
// Instantiate maps
Map<PoliticalMap> _politicalMap;
Map<PhysicalMap> _physicalMap;
};
理想情况下,您需要重新考虑您的课堂设计和意识形态。
答案 2 :(得分:0)
这里的自然设计似乎使用指向map
的成员。例如,使用unique_ptr
struct map
{
virtual ~map(); // required for unique_ptr to work
...
};
class atlas
{
std::unique_ptr<map> _map;
public:
atlas(int i)
: _map(i==0? new physicalMap():
i==1? new politicalMap():nullptr)
{
if(!_map)
throw std::runtime_error("not map");
}
};
您仍可继承map
,然后
class atlas : public map
{
public:
/* implement public interface of map using _map */
};
虽然这有点麻烦。