以值为基础存储派生类是否总是安全的?

时间:2013-04-28 19:23:20

标签: c++ polymorphism

以下代码似乎没有问题。

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”实际上拥有一个指向deriveB的指针?如果是这样,那是否意味着如果将其作为指向“base”的指针删除则会发生内存泄漏?

编译器:Visual Studio 2012。

1 个答案:

答案 0 :(得分:3)

  

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

这取决于你如何定义“安全”。但是,一般情况下,您不希望将派生类的对象分配给基类的对象,因为这会导致切片(正如您可能已经意识到的那样)。 C ++中的多态性是通过指针或引用来实现的。

  

这是否意味着“bb”实际上拥有一个指向deriveB的指针?

没有。如果条件为 false ,则会触发断言。在您的情况下,条件为true,因为base::foo()返回0,这与2不同。