2014-03-31 89 views
2

我有疑問,用C++重新定義。我在Derived類中分配內存,所以我需要這個內存在Base類中保留。所以,我需要考慮基類中的屬性與Derived類中的屬性相同,我不知道在C++中是可能的。覆蓋C++派生類中的數據成員

class Base { 
protected: 
    float * a; 
    Base() {} 
public: 
    virtual void reset() { 
    a = 0; 
    } 
    virtual void exec() { 
    printf("Memory a: %x\n",a); 
    } 
}; 

class Derivada: virtual public Base { 
protected: 
    float * a; 
    Derivada() {} 
    virtual void reset() { 
    a = new float[256]; 
    } 
}; 

int main() { 
    Derivada *hija= new Derivada();  
    hija->reset(); 
    hija->exec(); 
    delete hija; 
} 

我真的需要做的超載,因爲這是我真正的問題的一個例子。我對CVS的兩個分支中的兩個不同的類Base,每個分支都有一個相同的測試(派生一個主代碼)。

在這個類Base中,我有這個屬性,在另一個類Base中,我沒有這個屬性,所以我必須把它放在Derived類中進行編譯。

我不希望得把兩個不同的測試代碼,所以我需要重寫屬性

+1

您只需要在基類中聲明該變量。派生類應該使用基類的變量。 –

+1

如果這對你有用,你應該在'Base'中放置'std :: vector ',然後在'Derived :: reset()'中放置'resize(256)'。在每個班級中你不需要兩個'float * a'。目前,您不需要在'Base'中將'a'設置爲'nullptr',也不需要使用拷貝構造函數,賦值或析構函數來管理'a'的生命週期:內存總是被泄漏。一個'vector'會更容易,更安全。指針的'printf()'格式爲'%p'。 –

+0

我真的需要做陰影,因爲這是我真正的問題的一個例子。我在兩個不同的CVS分支中爲兩個不同的類Base創建了相同的測試(派生一個主代碼)。在這個類Base中,我有這個屬性,在另一個類Base中我沒有這個屬性,所以我必須把它放在Derived類中進行編譯。我想不做兩個不同的測試代碼 – user3480234

回答

2

你可以做這樣的事情(但需要C++ 11):

#include <type_traits> 

// A way to check for 'attr' data member presence/absence using SFINAE 
template<class T> constexpr auto missing_attr(T) -> decltype(T::attr, bool()) 
{ 
    return false; 
} 
constexpr bool missing_attr(...) { return true; } 

struct Base { /* There might be (or not) a float data member 'attr' */ }; 

template<bool> struct Inject; 
template<> struct Inject<true> { float attr = 0.0; }; 
template<> struct Inject<false> {}; 

struct Derived : public Base, protected Inject<missing_attr(Base())> 
{ 
    void do_something_with_attr() 
    { 
    // Derived has only one 'float attr' (it can be from Base or from Inject). 
    a *= a; 
    } 
}; 

還有其他的方法來檢測,如果數據成員存在,例如member detector idiom(兼容C++ 03)。

3

不要重新聲明該成員的派生類。 「保護」一詞確保可見度。

如果您重新聲明該成員,您將有一個新成員。這就是所謂的陰影。參見例如

+0

我真的需要做陰影,因爲這是我真正的問題的一個例子。我在兩個不同的CVS分支中爲兩個不同的類Base創建了相同的測試(派生一個主代碼)。在這個類Base中,我有這個屬性,在另一個類Base中我沒有這個屬性,所以我必須把它放在Derived類中進行編譯。我想不做兩個不同的測試代碼 – user3480234

+0

在這種情況下,您應該重新制定您的問題。我不確定繼承是否是實施該測試的最佳方式。建議:讓測試類擁有該字段的getter,並且測試代碼只能使用getter。然後,在getter中你可以擁有s.th.像「如果基類== XXX然後base.getA()... else」。 –