从虚拟类继承并在构造期间指定它

时间:2017-05-17 09:39:25

标签: c++ inheritance

我想拥有从虚拟类(例如,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(){...}
     ...
};

如何指定我想要的专业化?

3 个答案:

答案 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<>),并以这种方式实例化PhysicalMapPoliticalMap

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 */
};

虽然这有点麻烦。