c++ - 子对象上的 ostream 获取其父对象的 ostream

标签 c++ polymorphism ostream

我有一个装满小雕像的游戏板。

分配:

board = new Figure*[boardSize];
for (int i = 0; i < boardSize; ++i) board[i] = new Figure[boardSize];

for (int i = 0; i < boardSize; ++i)
{
    for (int j = 0; j < boardSize; ++j)
    {
        FreeSpot F( i,j );
        board[i][j] = F;
    }
}

我有两个类(class)

图:

class Figure {
  public:
        Figure          ( );
        ~Figure         ( void );

        virtual void  print ( ostream & os ) const;
        friend ostream  & operator << ( ostream & os, const Figure & F );

        int positionX;
        int positionY;
  private:
};

void Figure::print ( ostream & os ) const {
   os << "[" << positionY << "," << positionX << "]";
 }

ostream  & operator << ( ostream & os, const Figure & f ) {
   f . print ( os );
   return ( os );
 }

小时候,FreeSpot:

class FreeSpot: public Figure {
  public:

        FreeSpot            ( int, int );
        ~FreeSpot           ( void );

        virtual void print ( ostream & os ) const;
        friend ostream & operator << ( ostream & os, const FreeSpot & F );

        char shape;
  private:
};

void FreeSpot::print ( ostream & os ) const {
   os << "[" << positionY << shape << positionX << "]";
 }

 ostream  & operator << ( ostream & os, const FreeSpot & f ) {
   f . print ( os );
   return ( os );
 }

问题是,如果我尝试从板上找出 FreeSpot 对象,它需要 Figure 的 ostream。

cout << board[i][j];

我做错了什么吗? 非常感谢。

最佳答案

那是因为 object slicing .

boardFigure 的容器。所以当你这样做时:

    FreeSpot F( i,j );
    board[i][j] = F;

您将一个 FreeSpot 挤入一个图形中。 F 的 Figure 子对象将被复制到板中,但 FreeSpot 特定属性将丢失。这样结果将是一个 Figure

这就是为什么尽管您调用了多态 print(),但您最终只会打印图形。

解决方案

您必须使 board[][] 成为指向元素的指针数组。或者更好:shared_ptr。您将不再遭受切片的痛苦。内存管理会更容易:

const int boardSize=8; 
vector< vector< shared_ptr<Figure> > > board(boardSize, vector<shared_ptr<Figure>>(boardSize));

for (int i = 0; i < boardSize; ++i) {
    for (int j = 0; j < boardSize; ++j) {
        board[i][j] = static_pointer_cast<Figure>(make_shared<FreeSpot>(i,j));
        cout << *board[i][j]<< " ";
    }
    cout<<endl; 
}

关于c++ - 子对象上的 ostream 获取其父对象的 ostream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30337806/

相关文章:

C++:结合继承、多态和工厂

c++ - cout在哪里声明?

java - 为什么不使用 switch case 语句?

c++ - 如何使用 VTK 连接网格上的 LookupTable

c++ - 使用 Kasper Peeters 的 Tree.hh 库避免在节点中添加重复的子节点

c++ - 使用 CIMG for c++ 设置线条图案

c++ - 如何处理状态转换并将 "if"语句替换为多态类型?

C++ 分离成员流重载<<

c++程序将数字转换为不起作用的单词

c++ - 有没有办法映射与 Boost 一起使用的网络驱动器(带凭据)?