以下代码似乎没有问题。
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。
答案 0 :(得分:3)
但按值存储派生类是否总是安全的?
这取决于你如何定义“安全”。但是,一般情况下,您不希望将派生类的对象分配给基类的对象,因为这会导致切片(正如您可能已经意识到的那样)。 C ++中的多态性是通过指针或引用来实现的。
这是否意味着“bb”实际上拥有一个指向deriveB的指针?
没有。如果条件为 false ,则会触发断言。在您的情况下,条件为true
,因为base::foo()
返回0
,这与2
不同。