0

以下代码似乎运行没有问题。

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);

在这里,我很清楚地告诉编译器只为“基础”分配足够的数据。但是,(至少对我来说)断言没有被触发。这是否意味着“bb”实际上拥有一个指向deriveB 的指针?如果是这样,这是否意味着如果将其作为指向“base”的指针删除,则会发生内存泄漏?

编译器:Visual Studio 2012。

4

1 回答 1

3

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

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

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

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

于 2013-04-28T19:24:48.207 回答