按值存储派生类是否总是安全的?
Is it always safe to store store a derived class in base by value?
下面的代码似乎没有问题。
struct base
{
virtual int foo() {return 0;}
};
struct derriveA : base
{
int foo() {return 1;}
} A;
struct derriveB : base
{
int foo() {return 2;}
} B;
int main()
{
base a = A;
base b = B;
assert(a.foo() != 1);
assert(b.foo() != 2);
}
但是按值存储派生类总是安全的吗?是否存在丢失衍生数据的风险?以以下代码为例:
base* bb = new base(b);
assert(bb->foo() != 2);
这里我很清楚地告诉编译器只分配足够的数据给"base"。然而,(至少对我来说)断言没有被触发。这是否意味着"bb"实际上持有指向派生b的指针?如果是这样,这是否意味着如果它作为指向"基"的指针被删除,就会发生内存泄漏?
但是按值存储派生类总是安全的吗?
这取决于你如何定义"安全"。然而,一般来说,您不希望将派生类的对象赋值给基类的对象,因为这会导致切片(您可能已经意识到)。c++中的多态是通过指针或引用实现的。
这是否意味着"bb"实际上持有指向派生b的指针?
。如果条件为false,则assert触发。在您的示例中,条件是true
,因为base::foo()
返回0
,这与2
不同。
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- std::memmove在同一对象之间是否始终安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?