在方法调用中避免对象切片

时间:2015-11-03 08:47:13

标签: c++ oop inheritance

我一直在尝试重写我的程序以允许继承的类。我遇到切片问题。我最初在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);

2 个答案:

答案 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