2011-07-13 94 views
1

對我來說,描述我的問題是相當困難的。 我有兩個班,我會說​​和Derived_A。您可以從名稱中看到,類Derived_A源自​​。另外在我的程序中,我還有其他兩個類Base_BDerived_B(也有繼承)。類​​包含Base_B的對象,而類Derived_A包含Derived_B的對象。C++繼承指針

class Base_A { 
public: 
    Base_A() {} 
    virtual ~Base_A() {} 

    Base_B b_; 
    Base_B* pointer_; 

    void init() { 
     b_ = Base_B(); 
     pointer_ = &b_; 
     pointer_->setValue(1); 
    } 

    void print() { 
     pointer_->getValue(); 

    } 
}; 

class Derived_A: public Base_A { 
public: 
    Derived_A() {} 
    virtual ~Derived_A() {} 

    Derived_B b_; 
    Derived_B* pointer_; 

    void init() { 
     b_ = Derived_B(); 
     pointer_ = &b_; 
     pointer_->setValue(2); 
     pointer_->increaseValue(); 
    } 
}; 

class Base_B { 
public: 
    Base_B() {} 
    virtual ~Base_B() {} 

    int value_; 

    void setValue(int value) { 
     value_ = value; 
    } 

    void getValue() { 
     cout << "Base_B: " << value_ << endl; 
    } 
}; 

class Derived_B: public Base_B { 
public: 
    Derived_B() {} 
    virtual ~Derived_B() {} 

    void increaseValue() { 
     value_++; 
    } 
}; 

int main() { 
    Derived_A derived_A = Derived_A(); 
    derived_A.init(); 
    derived_A.print(); 

    return 0; 
} 

如何看到A的每個類有一個B類對象和指向此對象的指針。我的問題是,當我調用功能print()時,它不需要Derived_B* pointer_,但嘗試訪問Base_B* pointer_,這是不存在的。我怎麼能在我的程序中說,它應該根據班級採取指針?或者我需要declarate內Derived_A類像Base_B* pointer_

Base::pointer_ = pointer_; 

也許是有我的問題的其他方法或算法?

非常感謝。

+0

你可以創建一個虛函數來返回適當的指針。你知道Derived_A有兩個'pointer_'s嗎? –

+0

是的,我知道Derived_A有兩個指針。這只是一個例子。在真正的程序中,這個指針有不同的名字。關於你的想法。你的意思是說,我需要一個函數返回一個類B的指針,並將該指針指向函數print()? –

+0

或者直接將該方法調用到print()中。您也可以使虛擬打印並在派生類中重寫它。我不知道你在做什麼。 –

回答

3

「但嘗試訪問Base_B* pointer_,這是不存在的」

如果DerivedA不正確初始化BaseA,然後DerivedA不符合「ISA」的繼承和規則的設計需要改變。在臉上的東西:

  1. 不要重複使用在派生類中,如b_pointer_名。 它只是混淆,你沒有任何價值。
  2. 使init()爲虛擬。
  3. 已經DerivedA :: init()顯式調用BaseA :: init()。
  4. 使pointer_成爲虛擬方法。

請注意,對於虛擬方法使用「協變返回類型」。

class BaseA 
    { 
    public: 
     virtual BaseB* pointer() { return &b_; } 
     // etc. 
    }; 

class DerivedA : public BaseA 
    { 
    public: 
     virtual DerivedB* pointer() { return &b_; } 
     // etc. 
    }; 
0

如果Base_A :: init()被調用過,Base_A不會有指向Base_B的指針嗎? 你爲什麼不啓動基類?

+0

當我初始化()類Derived_A時,我更多地考慮覆蓋Base_B * pointer_的值。像我一樣可以重寫繼承中的虛函數。或者,也可以使用指針_的模板,可以有不同的類型。但我不知道如何。 –