2010-04-13 54 views
3

我想限定一個抽象基類X和執行以下操作:C++執行條件對繼承類

一個)每一個具體等級Y,從X繼承定義構造Y(INT X)

b)應該可以測試兩個Y對象是否相等。

對於一個不是很好的解決方案是在X 中放置一個純虛擬fromInt方法,具體類將必須定義。但我無法執行施工。

對於b)中,我似乎無法使用純虛擬方法在X

bool operator == (const X& other) const =0;

因爲在重寫類這仍然不確定。這是不夠的定義

bool operator == (const Y& other) const { //stuff}

因爲類型不匹配。我如何解決這些問題?

+1

爲什麼你關心你的派生類型構造函數是什麼樣的?或者他們是否定義了一個平等功能?如果你在某個地方使用這些模板(某個模板在某處?),那麼它將無法編譯。如果你不使用它們,那麼就沒有這樣的要求。請注意,你不能使用構造函數polymorphicaly,也不能'operator =='真的......(虛擬'operator =='最可能不會做你想做的事情) – 2010-04-13 22:06:26

回答

3

您可以通過將no參數構造函數設爲private並在您的基類中擁有公共單個int參數構造函數來強制構建。只要基類有一些純粹的虛擬方法,那麼你的子類必須調用該構造函數。

至於運營商==,嘗試在所有子類中定義

bool operator == (const BaseClass& other) const { .. };

。最糟糕的情況是,您可以定義一個公共等於(const BaseClass & other)的方法,該方法在您的基礎中是純虛擬的。

編輯:強迫構造函數並不完全正確。我建議強制子類調用單參數構造函數。他們可以有一個無參構造函數,它將常量傳遞給構造函數中的基礎。

+0

關於等號運算符==,難道這不會讓我做 像是 Y y; Z Z; (其中Y和Z從X繼承) 當我做(y == z)時,此測試將被允許。 – user231536 2010-04-13 21:40:24

+0

它應該工作。試試吧,看看:) – 2010-04-13 21:41:48

+0

@ user231536 - 做這樣的事情怎麼會有意義?如果==的兩個操作數不是相同的類型,那麼它們在「平等」的任何明智定義中是不相等的。 – 2010-04-13 21:46:43

0

a - 如果您使用CRTP和所有用戶代碼必須繼承的中介,朋友模板子類,則應該可能。事情是這樣:


struct X 
{ 
    virtual bool compare(X const&) const = 0; 
private: 
    X(); 

    template < typename T > 
    friend struct client_base; // don't recall the correct code here. 
}; 


template < typename Sub > 
struct client_base : X 
{ 
    // use boost::concepts to verify Sub has Sub(int) 
    Sub() : X() {} 
}; 

struct Y : client_base<Y> 
{ 
    Y(int); 

    bool compare(X const& x) 
    { 
    if ((Y* other = dynamic_cast<Y*>(x)) && *other == *this) return true; 
    return false; 
    } 
}; 

很顯然,我已經留下了很多關於你找出使之成爲一個完整的解決方案。

0

一)不具有意義,因爲對我來說,但你可以創造一些

template< typename T > 
Base* create(int x) 
{ 
    return T::create(x); 
} 

爲b)向google一下「多法」的實施在C++

2

爲B),則可以在十

定義virtual bool operator == (const X & other) const = 0你不能有const Y & other作爲比較參數,但伊蘇將自動澆注到的X,那麼你可以使用dynamic_cast的,看它是否是一個你可以用比較的類。

2

有一個簡單的解決方案。

// Class X 
// (... some documentation ...) 
// 
// ** NOTE: All subclasses of X must have a constructor that takes a single int, 
// ** and overload operator==. 

class X { 
... 
+2

說真的。任何需要子類來執行特定操作的設計都是糟糕的設計。 +1 – 2010-04-13 21:55:40

0

強制爲constructible從一個整數沒有任何意義:每個派生類是自由,因爲它是否希望去規定它的構造。然而,你可以強制它們傳遞一個整數給基類...不是說它無論如何都更有意義。

operator==也是扭曲的,你可以得到但它的本質:

class Base 
{ 
public: 
    bool operator==(const Base& rhs) const; 
    bool operator!=(const Base& rhs) const { return !(*this == rhs); } 

private: 
    virtual bool equals(const Base& rhs) const = 0; // will pass only objects 
                // of the same dynamic type 
}; 

bool Base::operator==(const Base& rhs) const 
{ 
    return typeid(*this) == typeid(rhs) && this->equals(rhs); 
} 

bool Derived::equals(const Base& rhs) const // We KNOW Base is actually a Derived 
{ 
    return *this == static_cast<const Derived&>(rhs); 
} 

你可以嘗試通過使用模板和CRTP美化了一點,但如果Derived從繼承什麼?它不會成立。