我一直在尝试重写我的程序以允许继承的类。我遇到切片问题。我最初在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);
答案 0 :(得分:2)
是。这一行:
*m_parent = parent;
导致将对象切成Parent
个对象,无论它到底是什么。
除此之外,您的示例中有许多错误的代码行,但我想这只是因为它是一个非常具体的问题。
修改强> 建议如何避免切片:
template <class T>
void testFunction(T& t){
static_assert(std::is_base_of<Parent,T>::value,"only subclasses of Parent may be passed to testFunction");
delete m_parent;
m_parent = new T(t); //or: new T(std::move(t));
}
编辑2:
如果您将子对象作为真实对象而不是父指针传递,这将起作用,AKA testFunction(myChild)
EDIT3: @ Jarod42对clone
方法有一个很好的观点。这两个解决方案可以一起使用
答案 1 :(得分:2)
没有对象切片,但if password == " 05251":
os.system("clear")
print "Access Granted"
time.sleep(2)
print "Lunch number: " + password
break
不会成为m_parent
,只会复制Child
。
如果您想在string a
中保留副本,建议您使用Test
:
Clone