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/

  • 相关阅读:
    Java: 数据类型
    数据结构是什么
    数据结构:进制转换
    数据结构:堆与栈
    class的写法
    Java:异常体系
    数据结构: 先进后出——堆栈
    tomcat:web容器
    Windows: Dos命令
    面向函数范式编程
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3502008.html
Copyright © 2011-2022 走看看