按值存储派生类是否总是安全的?

Is it always safe to store store a derived class in base by value?

本文关键字:安全 是否 存储 派生      更新时间:2023-10-16

下面的代码似乎没有问题。

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不同。