gpt4 book ai didi

c++ - 避免在方法调用中进行对象切片

转载 作者:行者123 更新时间:2023-11-30 01:46:15 25 4
gpt4 key购买 nike

我一直在尝试重写我的程序以允许继承类。我遇到了切片问题。我最初在我的 Test 类中有 Parent m_parent(因此在 Test 中没有动态分配),但补充说认为它会解决我的问题,但它没有。我不知道我是否让我的问题变得更糟,或者它是否像编写复制构造函数(或其他一些简单的修复程序)一样简单。

class Parent
{
public:
Parent();
private:
string a;
};
class Child : public Parent
{
private:
string b;
};
class Test
{
public:
Test()
{
m_parent = new Parent;
}
void testFunction(Parent &parent)
{
*m_parent = parent;
}
~Test()
{
delete m_parent;
}
private:
Parent * m_parent;
};

做这样的事情仍然会导致切片......

Child c("foo", "bar");
Parent * p = &c;
Test.testFunction(*p);

最佳答案

没有对象切片,但是 m_parent 没有变成 Child 并且只复制了 string a

如果你想在Test中保留一个拷贝,我建议使用Clone:

class Parent
{
public:
virtual ~Parent() = default;
virtual Parent* Clone() const { return new Parent(*this); }
private:
string a;
};

class Child : public Parent
{
public:
Child* Clone() const override { return new Child(*this); }
private:
string b;
};

class Test
{
public:
void testFunction(const Parent &parent)
{
m_parent.reset(parent.Clone());
}

private:
std::unique_ptr<Parent> m_parent;
};

关于c++ - 避免在方法调用中进行对象切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33494757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com