2017-05-01 1 views
1

他のクラスのテンプレートとして使用できるクラスを作成しようとしています。多分私は間違ったキーワードを探しています。基本的にはPrimaryClassとクラスAを純粋な仮想にしたいと思います。 DerivedClassおよびCは、それぞれのクラスから導かれる。 問題は、継承クラスを呼び出すことです。CDerivedClass私は純粋な仮想PrimaryClassをオーバーライドしていません。私はこれを認識していますが、それを修正する方法はわかりません。入れ子抽象基本クラスの汎用テンプレート

私はCAから派生しているので印象を受けました。 私はA

virtual void DoFunThings (C<T>* d) {} 

Cを変更した場合、それは動作しますが、これのポイントはA異なっ派生バージョンが使用できるようにすることです。それは、このようにそれを行うことはできません場合はどのように1は自分の目的の機能で一般的なオブジェクト指向のコードをすることについて

template <class T> 
class A 
{ 
public: 
    virtual void FunThings (const A<T> &orig, A<T>* new_one) = 0; 
    T thing{}; 
}; 


template <class T> 
class C: public A <T> 
{ 
public: 
    virtual void FunThings (const C<T> &orig, C<T>* new_one) {} 

}; 


template <class T> 
class PrimaryClass 
{ 
public:  
    virtual void DoFunThings (A<T>* d) = 0; 
}; 



template<class T> 
class DerivedClass: public PrimaryClass<T> 
{ 
public: 
    virtual void DoFunThings (C<T>* d) {} 
}; 


int main() 
{ 
    DerivedClass<int> derived; 

    return 0; 
} 

を行くことができますか?

答えて

1

もちろん、DoFunThingsPrimaryClassは、DerivedClassに上書きされません。あなたはただをオーバーロードしてです。それを無効にするには、同じ署名が必要です。 overrideキーワードを使用すると、このミスをC++ 11で簡単に検出できます。

template <class T> 
class A 
{ 
public: 
    virtual void FunThings (const A<T> &orig, A<T>* new_one) = 0; 
    T thing{}; 
}; 

template <class T> 
class C: public A <T> 
{ 
public: 
    virtual void FunThings (const C<T> &orig, C<T>* new_one) {} 
}; 

template <class T> 
class PrimaryClass 
{ 
public:  
    virtual void DoFunThings (A<T>* d) = 0; 
}; 

template<class T> 
class DerivedClass: public PrimaryClass<T> 
{ 
public: 
    virtual void DoFunThings (C<T>* d) override {} 
}; 

int main() 
{ 
    DerivedClass<int> derived; 
} 

今(私の場合クラン内)コンパイラはエラーを発します:(のint

test.cpp:27:18: error: 'DoFunThings' marked 'override' but does not override any 
     member functions 
    virtual void DoFunThings (C<T>* d) override {} 
+0

私は上書きの問題を認識しており、Aの派生を利用するための解決策が必要だと述べました。 – MacAttack

0

ソリューションはPrimaryClassを与えることであるとDerivedClassは& Cのためのユニークなデータ型でないテンプレート質問)が、クラス& C.

template <class D> 
class PrimaryClass 
{ 
public: 

    virtual void DoFunThings (D* d) = 0; 
}; 



template<class D> 
class DerivedClass: public PrimaryClass<D> 
{ 
public: 
    virtual void DoFunThings (D* d) {} 
}; 


int main() 
{ 
    DerivedClass<C<int>> derived; 

    return 0; 
} 

のために私はCがAから派生しているので、それを使用することができることが障害のある仮定の下にありました。私はそれを読んだり誤解したりしていますが、無駄な時間を浪費しています。

0

機械とテンプレートのビットを使って、何らかの形で仮想関数テンプレートをシミュレートし、探しているものに近いもの(おそらく)を得ることができます。一例として、

#include<type_traits> 
#include<iostream> 

template <class T> 
class A {}; 

template <class T> 
class B: public A <T> {}; 

template <class T> 
class C: public A <T> {}; 

template <class> 
class PrimaryClass; 

template <typename T, template<typename> class U> 
class PrimaryClass<U<T>> 
{ 
    template<typename D, typename Z = U<T>> 
    auto DoFunThings(int, D *d) 
    -> decltype(static_cast<Z*>(this)->DoFunThingsOverride(d)) { 
     return static_cast<Z*>(this)->DoFunThingsOverride(d); 
    } 

    void DoFunThings(char, A<T> *) { 
     // do whatever you want if 
     // derived class has not a 
     // proper specialization 
     std::cout << "PrimaryClass::DoFunThings" << std::endl; 
    } 

public: 
    template<typename D> 
    std::enable_if_t<std::is_base_of<A<T>, D>::value, void> 
    DoFunThings (D* d) { 
     DoFunThings(0, d); 
    } 
}; 

template<class T> 
class DerivedClass: public PrimaryClass<DerivedClass<T>> 
{ 
public: 
    void DoFunThingsOverride (C<T>*) { 
     std::cout << "DerivedClass::DoFunThings" << std::endl; 
    } 
}; 


int main() 
{ 
    DerivedClass<int> derived; 
    B<int> b; 
    C<int> c; 

    derived.DoFunThings(&b); 
    derived.DoFunThings(&c); 

    return 0; 
} 

wandboxでそれを参照してください。

関連する問題