c++ - 如何优雅地切割物体

标签 c++ object-slicing

所以基本上我有一个类 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/

相关文章:

c++ - C++编写的分词器的继承设计

c++ - unsigned char (*pArray[10][10])的含义;

c++ - stat(char[], stat) 当 string.c_str() = "c:/"时返回 -1

c++ - vector<unique_ptr<T>> 在 ubuntu 中占用的内存是 vector<T> 的三倍以上

python - 如何在 C++ 中进行 Python 风格的字符串切片

c++ - 使用 union (封装在结构中)绕过 neon 数据类型的转换

c++ - 关于构造函数匹配和隐式转换的问题

c++ - 如何在不邀请 future 对象切片的情况下实现 ICloneable

c++ - 什么是对象切片?

c++ - 我们可以超越对象切片吗?