Skip to content

Latest commit

 

History

History
97 lines (70 loc) · 1.54 KB

081 - 什么是对象切割.md

File metadata and controls

97 lines (70 loc) · 1.54 KB

https://stackoverflow.com/questions/274626/what-is-object-slicing

问题

什么是对象切割(object slicing)?

回答

切割的意思是说,你把一个子类对象赋给父类,那么相比父类,子类对象多出的成员会被丢弃掉。比如,

class A {
   int foo;
};

class B : public A {
   int bar;
};

B b;
A a = b;

赋给 a 后,b 里的 bar 就会被丢掉。

此外,当一个派生类对象通过值传递给基类对象,这个基类的拷贝构造函数将被调用,默认执行 memberwise copy。此时派生类的特性将被切割,只有基类相关操作。也就是说如果我们向上转型如果不用引用或指针,对象将被切割。这是也我们应该传引用或指针而不是传值的原因。

#include <iostream>
#include <cstdlib>

using namespace  std;

class Base
{
public:

    Base()
    {
        cout << "Base()" << endl;
    }

    Base(const Base& b)
    {
        cout << "Base(const Base&)" << endl;
    }

    virtual void fun()
    {
        cout << "Base fun()"  << endl;
    }
};

class Derived: public Base
{
public:

    void fun()
    {
         cout << "Derived fun()" << endl;
    }
};

void fun1(Base b)
{
     b.fun();
}

void fun2(Base *b)
{
     b->fun();
}

void fun3(Base &b)
{
     b.fun();
}

int main()
{
    Derived d;

    fun1(d);  // output:
              // Base(const Base&)
              // Base fun()

    fun2(&d); // output:
              // Derived fun()

    fun3(d); // output:
             // Derived fun()

    return 0;
}