2016-06-10 63 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; 
} 

及其工作好:)