以下代码似乎运行没有问题。
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。