C++ 如何将子类分配给函数中的抽象类指针? void播放器::移动(棋盘&棋盘,解算器&解算器){ 位置*最佳=解算器。查找最佳移动(&B); cout

C++ 如何将子类分配给函数中的抽象类指针? void播放器::移动(棋盘&棋盘,解算器&解算器){ 位置*最佳=解算器。查找最佳移动(&B); cout,c++,pointers,reference,abstract-class,object-slicing,C++,Pointers,Reference,Abstract Class,Object Slicing,我会使用Board*指针而不是Board&引用,特别是因为涉及到子类: void Player::move(Board &board, Solver &solver){ Position* best = solver.find_best_move(&board); cout<<"Score: "<<best->get_score()<<endl; cout<<"Board: "; best-&g

我会使用
Board*
指针而不是
Board&
引用,特别是因为涉及到子类:

void Player::move(Board &board, Solver &solver){
   Position* best = solver.find_best_move(&board);
   cout<<"Score: "<<best->get_score()<<endl;
   cout<<"Board: ";
   best->get_board()->print_board();
   board = *(best->get_board());
   Board * b(best->get_board());
   cout<<"TEST: ";
   b->print_board();
   board = *b;
  }
void播放器::移动(棋盘**棋盘、解算器和解算器)
{ 
位置*最佳=解算器。查找最佳移动(*板);

修改实际参考时不能执行
Huh
board=*(最佳->获取板()
这可能会做一个
板上的
复制。您将要实现一些虚拟的
克隆
函数,并且必须在每个派生类中实现它。请注意,您不能修改引用,只需修改它引用的内容。同意,您应该提到潜在的内存泄漏:一个must在为指针指定新值之前,请确保原始指针对象已(或将)被销毁。即使我传入Board的指针子类,例如ChessBoard*Board=new ChessBoard,并将其传递到move(&Board,solver)中,这是否有效@J.N:我想的更多的是将对子类实例的引用分割成一个
Board
实例,这样所有的子类信息都会丢失。@user979663:只要总是返回
棋盘
或子类,它就可以工作。但是如果可以返回与无关的不同类型的
Board
ode>ChessBoard
,则必须将变量声明为
Board*
而不是
ChessBoard*
。此外,如果
new
原始
Board
,则在使用完后不要忘记
删除它。如果
move()
要更改指针,则
必须
删除
原件,否则调用代码需要记住原件,以便在
移动()后
删除
原件
exits.Aha,我现在什么都懂了。我想做的是改变点的指向。我需要的线索是使用双指针。谢谢你,雷米,我整天都在努力解决这个问题,我觉得我尝试了一切。谢谢
void Player::move(Board **board, Solver &solver)
{ 
   Position *best = solver.find_best_move(*board); 
   cout << "Score: " << best->get_score() << endl; 
   *board = best->get_board(); 
   cout << "Board: "; 
   (*board)->print_board(); 
} 

Player p;
Solver solver;
Board *b = ...;
p.move(&b, solver);
void Player::move(Board* &board, Solver &solver)
{ 
   Position *best = solver.find_best_move(board); 
   cout << "Score: " << best->get_score() << endl; 
   board = best->get_board(); 
   cout << "Board: "; 
   board->print_board(); 
} 

Player p;
Solver solver;
Board *b = ...;
p.move(b, solver);