Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在';对象切片';将派生类强制转换为基类时_C++ - Fatal编程技术网

C++ C++;在';对象切片';将派生类强制转换为基类时

C++ C++;在';对象切片';将派生类强制转换为基类时,c++,C++,当我尝试将派生类对象分配给基类时,派生类中的“唯一”部分将被切分。那么,那些被切掉的部分会发生什么呢?它们是被正确地销毁了还是只是在记忆中丢失了?如果我在这些派生部分上分配一些内存,当对象切片发生时,分配的内存会被正确释放吗?我想这会导致一些未定义的行为,因为在对象切片时,我们从未声明一种销毁这些派生部分的方法 毕竟,在什么情况下我们需要使用对象切片?或者我们应该始终避免这种情况?对象切片通常在将派生类对象复制到基类对象时发生。因此,基类对象具有切片后剩余的数据。基本对象中的另一部分丢失。为了避

当我尝试将派生类对象分配给基类时,派生类中的“唯一”部分将被切分。那么,那些被切掉的部分会发生什么呢?它们是被正确地销毁了还是只是在记忆中丢失了?如果我在这些派生部分上分配一些内存,当对象切片发生时,分配的内存会被正确释放吗?我想这会导致一些未定义的行为,因为在对象切片时,我们从未声明一种销毁这些派生部分的方法


毕竟,在什么情况下我们需要使用对象切片?或者我们应该始终避免这种情况?

对象切片通常在将派生类对象复制到基类对象时发生。因此,基类对象具有切片后剩余的数据。基本对象中的另一部分丢失。为了避免这种情况,可以使用指针或对对象的引用作为函数参数传递,因为任何类型的指针或引用占用相同的内存量。或者,可以通过禁止对象创建,使基类函数纯虚拟来防止对象切片。无法创建包含纯虚方法的类的对象

#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;  } 
}; 

// Global method, Base class object is passed by value 
void somefunc (Base obj) 
{ 
    obj.display(); 
} 

int main() 
{ 
    Base b(33); 
    Derived d(45, 54); 
    somefunc(b); 
    somefunc(d);  // Object Slicing, the member j of d is sliced off 
    return 0; 
} 
如果我们使用指针并将程序更改为following,我们将得到相同的输出

// rest of code is similar to above 
void somefunc (Base *objp) 
{ 
    objp->display(); 
} 

int main() 
{ 
    Base *bp = new Base(33) ; 
    Derived *dp = new Derived(45, 54); 
    somefunc(bp); 
    somefunc(dp);  // No Object Slicing 
    return 0; 
} 

这取决于你怎么做。当分配源时,基不知道的位不会被复制,或者我们应该避免这样做?
// rest of code is similar to above 
void somefunc (Base *objp) 
{ 
    objp->display(); 
} 

int main() 
{ 
    Base *bp = new Base(33) ; 
    Derived *dp = new Derived(45, 54); 
    somefunc(bp); 
    somefunc(dp);  // No Object Slicing 
    return 0; 
}