zoukankan      html  css  js  c++  java
  • Object Slicing in C++

    In C++, a derived class object can be assigned to base class, but the other way is not possible.

    class Base {
    	int x,y;
    };
    
    class Derived : public Base {
    	int z, w;
    };
    
    int main() {
    	Derived d;
    	Base b = d;
    }
    

    Object slicing happens when a derived class object assigned to base class, additional attributes of derived class is sliced off to form base class.

    #include <iostream>
    using namespace std;
    
    class Base {
    	protected:
    		int i;
    	public:
    		Base(int a) {
    			i = a;
    		}
    		virtual void display() {
    			cout << "I am Base class object, i = " << i << endl;
    		}
    };
    
    class Derived : public Base {
    	int j;
    public:
    	Derived(int a, int b) : Base(a) {
    		j = b;
    	}
    	virtual void display() {
    		cout << "I am Derived class object, i = " << i << ", j = " << j << endl;
    	}
    };
    
    void somefunc(Base obj) {
    	obj.display();
    }
    
    int main() {
    	Base b(33);
    	Derived d(45, 54);
    	somefunc(b);
    	somefunc(d);
    	return 0;
    }
    

    Output

      I am Base class object, i = 33

      I am Derived class object, i = 45

    We can avoid such unexpected behavior with the use of pointer or reference. Object slicing won't happen if we set the function arguments to pointer or reference because all pointer or reference have same amount memory

    we can avoid object slicing by writing like this

    void somefunc(Base *obj) {
    	...
    }
    void somefunc(Base &obj) {
    	...
    }
    

    from http://www.geeksforgeeks.org/object-slicing-in-c/

  • 相关阅读:
    Interesting Finds: 2008.06.12
    8月19号
    8月22号
    8月20号
    8月21号
    第七章 Nginx配置虚拟主机
    第六章 Nginx配置文件详解
    第五章 Nginx搭建上传作业平台
    sqlserver2005提供的xml数据类型操作xml串
    事必躬亲利与弊
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3502008.html
Copyright © 2011-2022 走看看