2016-06-10 84 views
-1

如何在派生類中更改繼承變量的類型? 我有以下類:其中問題是由一個箭頭標記派生類中的向上變量C++

class Position; 
class StonePosition; 

class Position { 
public: 
    Position() {} 
}; 

class StonePosition : public Position { 
    int count; 
public: 
    StonePosition(const int count) { this->count = count; } 
    int getCount() { return this->count; } 
    void setCount(int count) { this->count = count; } 
    friend ostream& operator<<(ostream&, StonePosition); 
}; 

class Board { 
protected: 
    Position* crrPos; 
public: 
    Board() { } 
    Position* getCrrPos() { return crrPos; } 
    void setCrrPos(Position* pos) { crrPos=pos; } 
}; 

class StoneBoard : public Board { 
public: 
    StoneBoard(const int &count) { this->crrPos=new StonePosition(count); } //<---------------- 
    StonePosition* getCrrPos() { return (StonePosition*)crrPos; } 
    void setCrrPos(StonePosition* pos) { crrPos=pos; } 
}; 

地方。我需要在StoneBoard類中將變量的類型從Position更改爲StonePosition。我發現了一個可用於上傳的選項,但它只能在單一方法中使用,而且我需要更改整個類的變量。

問題解決了,看看我的答案。

+3

'template class TBoard {..}'可能會有所幫助。 – Jarod42

+1

C++並不那麼靈活。你不能改變變量的類型。這就是爲什麼'模板'存在https://en.wikipedia.org/wiki/Template_(C%2B%2B) –

+0

爲什麼你需要改變類型?看起來你可以在需要的時候將'dynamic_cast'變成'StonePosition'(就像你使用'getCrrPos' – lcs

回答

0

變量「crrPos」不是類型的位置的它是類型的指針到位置,這是顯著因爲指針到位置可以指向從位置導出,而不會丟失一位置或類任何東西。

如果你很好地設計你的班級,並利用虛擬功能,你通常可以避免完全上傳。

#include <iostream> 

class Base { 
public: 
    virtual void foo() { std::cout << "Base::foo()\n"; } 
    virtual bool isDerived() const { return false; } 
}; 

class Derived : public Base { 
public: 
    void foo() override { std::cout << "Derived::foo()\n"; } 
    bool isDerived() const { return true; } 
}; 

int main() { 
    Base* crrPos = new Derived; 
    crrPos->foo(); 
    bool isDerived = crrPos->isDerived(); 
    std::cout << isDerived << '\n'; 
    delete crrPos; 
} 

現場演示:http://ideone.com/UKcBaA

+0

那麼,指針對我來說也是一個問題,例如指向類的指針Position不知道變量計數的存在。 – Nawy

-2

的問題已經解決了,我只是用投影((StonePosition *)職位*):

#include <iostream> 
using namespace std; 
class Position; 
class StonePosition; 

class Position { 
public: 
    Position() {} 
}; 

class StonePosition : public Position { 
    int count; 
public: 
    StonePosition(const int count) { this->count = count; } 
    int getCount() { return this->count; } 
    void setCount(int count) { this->count = count; } 
    friend ostream& operator<<(ostream&, StonePosition); 
}; 
template <typename TPos> class TBoard { 
protected: 
    TPos* crrPos; 
public: 
    TBoard() { } 
    TPos* getCrrPos() { return crrPos; } 
    void setCrrPos(TPos* pos) { crrPos=pos; } 
}; 
class Board { 
protected: 
    Position* crrPos; 
public: 
    Board() { } 
    Position* getCrrPos() { return crrPos; } 
    void setCrrPos(Position* pos) { crrPos=pos; } 
}; 

class StoneBoard : public Board { 
public: 
    StoneBoard(const int &count) { this->crrPos=new StonePosition(count); } 
    Position* getCrrPos() { return crrPos; } 
    void setCrrPos(Position* pos) { crrPos=pos; } 
}; 

int main(){ 
    StoneBoard s(7); 
    cout<<((StonePosition*)s.getCrrPos())->getCount();//<----right here 
    system("pause"); 
    return 0; 
} 

及其工作好:)