C++对象分割

首先来看下面程序的输出结果是什么?

#include 
 
using namespace std;
 
class A
{
public:
    virtual void print()
    {
        cout << "A::print()" << "\n";
    }
};
 
class B: public A
{
public: virtual void print()
    {
        cout << "B::print()" << "\n";
    }
};
 
class C: public A
{
public: virtual void print()
    {
        cout << "C::print()" << "\n";
    }
};
 
void print(A a)
{
    a.print();
}
 
int main()
{
    A a, *aa, *ab, *ac;
    B b;
    C c;
    aa = &a;
    ab = &b;
    ac = &c;
    a.print();
    b.print();
    c.print();
    aa->print();
    ab->print();
    ac->print();
    print(a);
    print(b);
    print(c);
}

输出结果:A::print() B::print() C::print() A::print() B::print() C::print() A::print() A::print() A::print()

多态的实现是通过指针和引用;而对象的转换只会造成对象切割,不能实现多态 。

对象分割概念:

        当一个子类对象通过值传递给基类对象,如print(A a),这个基类的拷贝构造函数将被调用.此时子类的特性将被切割,只有基类相关操作。也就是说如果我们向上转型如果不用引用或指针,对象将被切割。这是也我们应该传引用而不是传值的原因。

        在传值例子中,因为print()是被A 的对象执行的object.这样倒至A对象被进行压栈操作.这样就造成如果是值传递调用A默认构造函数,初始化vptr通过A类的vtbl并且只拷贝A部分.所以结果只剩下A部分了。



你可能感兴趣的:(C++)