【问题标题】:upcasting variable in derived class c++派生类c ++中的向上转换变量
【发布时间】:2016-10-11 19:21:09
【问题描述】:

如何更改派生类中继承变量的类型? 我有以下课程:

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。我找到了一个可以使用向上转换的选项,但它只能在单个方法中工作,我需要更改整个类的变量。

问题解决了,看我的回答。

【问题讨论】:

  • template &lt;typename TPos&gt; class TBoard { ..} 可能会有所帮助。
  • c++ 没有那么灵活。您不能更改变量的类型。这就是为什么Templates 存在en.wikipedia.org/wiki/Template_(C%2B%2B)
  • 为什么要改类型?似乎您可以在需要时将dynamic_cast 转换为StonePosition(就像您对getCrrPos 所做的那样
  • @lcs 因为我需要在 StoneBoard 类中更改 StonePosition 上的变量 Position 的值
  • @Nawy dynamic_cast 用于将父类型指针安全地转换为子类型指针。不要使用 C 风格的演员表。它们不安全。

标签: c++ class derived-class upcasting


【解决方案1】:

变量“crrPos”不是位置类型,它是指向位置的指针,这很重要,因为指向位置的指针可以指向 Position 或从 Position 派生的类而不会丢失任何内容。

如果你设计好你的类,并利用虚函数,你通常可以避免完全向上转换的需要。

#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

【讨论】:

  • 好吧,指针指向我也是个问题。例如,指向类 Position 的指针不知道变量 count 的存在。
【解决方案2】:

问题已经解决了,我只是用投影((StonePosition*)Position*):

#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;
}

而且它工作得很好:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 2021-04-22
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多