Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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++ - Fatal编程技术网

C++ 切片,无需切片

C++ 切片,无需切片,c++,C++,如果我有如下代码: class Base { /* ... */}; class Derived : public Base { /* ... */ }; int main() { Base b = Derived{}; } 然后代码展示了切片问题。属于类派生的但不属于类基础的任何数据都将丢失。但是假设派生的没有任何不在基中的数据成员或基类,因此不会丢失任何数据 此代码是否仍显示未定义的行为或其他问题?通常来说,切片没有未定义的行为:它通常只是不执行您希望它执行的操作。在这种情况

如果我有如下代码:

class Base { /* ... */};
class Derived : public Base { /* ... */ };

 int main() {
    Base b = Derived{};
 }
然后代码展示了切片问题。属于类
派生的
但不属于类
基础的任何数据都将丢失。但是假设
派生的
没有任何不在
中的数据成员或基类,因此不会丢失任何数据


此代码是否仍显示未定义的行为或其他问题?

通常来说,切片没有未定义的行为:它通常只是不执行您希望它执行的操作。在这种情况下,我看不到任何问题,尽管我也看不出为什么您需要一个没有向基添加任何内容的子类。

通常来说,切片没有未定义的行为:它通常不做您希望它做的事情。在这种情况下,我看不到任何问题,尽管我也看不出为什么需要一个没有向基添加任何内容的子类。

不,这里没有未定义的行为。切片不会导致未定义的行为。这只是当你将一个派生类复制到一个基类对象时会发生的事情——你失去了“派生性”。在这个例子中,你可以简单地将B的类型派生出来,正如你所知。没有数据可以丢失,但是不要忘记虚拟函数会丢失。这里唯一的问题是:为什么需要一个与其基完全相同的派生类?我知道你问的是一个理论问题,但仍然是。不,这里没有未定义的行为。切片不会导致未定义的行为。这只是当你将一个派生类复制到一个基类对象时会发生的事情——你失去了“派生性”。在这个例子中,你可以简单地将B的类型派生出来,正如你所知。没有数据可以丢失,但是不要忘记虚拟函数会丢失。这里唯一的问题是:为什么需要一个与其基完全相同的派生类?我知道你问的是一个理论问题,但仍然是。一个用例是如果你有只读句柄和变异句柄类。变异句柄可以扩展只读句柄,同时只添加功能(而不添加数据成员)。@rburny除非我缺少某些东西(这是可能的),“可写句柄”在继承的is-a和可替换性测试中都失败。我看不出问题。如果只使用const方法,“可写句柄”可以用作“只读句柄”。它是“可写的”,而不是“只写的”。一个用例是如果您有只读句柄和变异句柄类。变异句柄可以扩展只读句柄,同时只添加功能(而不添加数据成员)。@rburny除非我缺少某些东西(这是可能的),“可写句柄”在继承的is-a和可替换性测试中都失败。我看不出问题。如果只使用const方法,“可写句柄”可以用作“只读句柄”。它是“可写的”,而不是“只写”。