2017-05-17 12 views
1

仮想クラス(例えばMAP)を継承するクラス(例えばATLAS)を持っていますので、MAPの特殊化の1つはATLASのコンストラクタで指定されたもの(例えば、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

これには仮想継承は必要ありません。テンプレートのメタプログラミングを使用することを検討してください。ここでは、クラスタイプ自体をテンプレートタイプのパラメータとして渡すことができます。

例:

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が必要な場合は、これら2つの中間クラス(Map<>から継承)をスキップして、PhysicalMapPoliticalMapをこのようにインスタンス化できます。

class PoliticalMap; // non-templated 
class PhysicalMap; 

class Atlas 
{ 
    // Instantiate maps 
    Map<PoliticalMap> _politicalMap; 
    Map<PhysicalMap> _physicalMap; 
}; 

理想的には、クラスのデザインとイデオロギーを再考する必要があります。

1

"sister"(同じ基本クラスを継承するクラス)クラスコンストラクタにコンストラクタを委譲することはできません。

は、しかし、あなたがテンプレートパラメータを継承し、そのような何かを行うことができますテンプレートを:

class map {...}; 

class physicalMap: public virtual map {...}; 

class politicalMap: public virtual map {...}; 

template<typename Map> 
class atlas: public virtual Map { 
    atlas(int i): Map(){...} 
    ... 
}; 

... 
atlas<physicalMap> a; 
... 
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 */ 
}; 

を継承することができます。

関連する問題