2017-05-01 28 views
1

我正在嘗試製作可用於模板其他類的類。也許我在尋找錯誤的關鍵詞。基本上我想PrimaryClass和類A是純虛擬的。 DerivedClassC是從它們各自的類派生的。 問題是,通過調用繼承的類:CDerivedClass我不重寫純虛擬PrimaryClass。我知道這一點,但我不知道如何解決它。嵌套抽象基類的通用模板

我的印象是,由於C是從A派生出來的,它會起作用。 如果我在

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

改變CA它的工作原理,但這樣做的關鍵是允許使用不同的衍生版本A

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

當然,您不是PrimaryClassDoFunThingsDerivedClass。你只是重載吧。要覆蓋它,它們必須具有相同的簽名。您可以使用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; 
} 

現在,編譯器(在我的情況鏘)將發出一個錯誤:

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模板唯一數據類型的不爲甲&℃(中間體在的問題),但對於類A & 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