所以基本上我有一个类 SomethingSwimming
和一个派生类 Ship
。我想实现的是,在某些事件中,Ship
可能会失去其特殊品质(例如将龙虾扣为人质),并成为另一个 SomethingSwimming
对象。
举例说明:
class SomethingSwimming
{
protected:
int m_treasures;
public:
SomethingSwimming(int treasures): m_treasures(treasures) {;}
virtual int howManyLobstersOnBoard() {return 0; }
};
class Ship: public SomethingSwimming
{
protected:
int m_lobstersOnBoard;
public:
Ship(int treasures, int lobstersOnBoard): SomethingSwimming(treasures), m_lobstersOnBoard(lobstersOnBoard) {;}
int howManyLobstersOnBoard() {return m_lobstersOnBoard; }
};
void crash(shared_ptr<SomethingSwimming>& b)
{
b = make_shared<SomethingSwimming>(100);
}
int main()
{
shared_ptr<SomethingSwimming> a = make_shared<Ship>(100, 12);
cout << "How many lobsters on board: " << a->howManyLobstersOnBoard() << endl;
crash(a);
cout << "How many lobsters on board: " << a->howManyLobstersOnBoard() << endl;
return 0;
}
我的问题是如何崩溃
Ship
,使其变成SomethingSwimming
(所以它不是Ship
)不再)无需重新初始化。
最佳答案
无法在保留基本子对象的标识的同时删除对象的其余部分。您可以创建基本子对象的新拷贝,并丢弃派生对象。
当前,您在crash
中创建了一个不相关的对象,因此m_treasures
不会受到先前指向的对象的m_treasures
的影响。要创建原始基础子对象的拷贝,您可以执行以下操作:
b = make_shared<SomethingSwimming>(*b);
或者,在调用站点,您可以通过静态调用虚拟成员函数将间接引用的基类视为不是派生对象的一部分:
a->SomethingSwimming::howManyLobstersOnBoard()
无论对象的派生程度最高的类型如何,这都会导致 m_treasures
的值。
关于c++ - 如何优雅地切割物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53022222/