3

我有一个类层次结构,我想禁止这样做:

Foo *f = new Foo();
Bar *b = new Bar();

f = b;

Foo的超类在哪里Bar。这样做会切开Bar对象的一部分。我知道您可以通过将operator=其设为私有来解决此问题,但是是否可以仅禁止使用不同类型的赋值运算符?

就像operator=私有化但仍然允许这样做:

Bar *b1 = new Bar();
Bar *b2 = new Bar();

b1 = b2;

假设子类也将被制作Bar

4

3 回答 3

4

既然你在谈论切片,我假设你实际上试图阻止的是:

Foo f;
Bar b;

f = b;

在这种情况下,是的,您可以通过将适当的 operator= 设为私有来阻止分配。

您不能阻止指针分配,但请注意,指针分配无论如何都不会导致切片。

于 2012-12-20T16:51:21.767 回答
2

这超出了您的能力范围:用户定义的运算符必须至少采用一个用户定义(非内置)类型的参数。由于指针是内置类型,所以你在这里不走运。f = b不管你做什么都是合法的。

于 2012-12-20T16:50:55.703 回答
0

在您的示例中不会发生切片:

Foo *f = new Foo();
Bar *b = new Bar();

f = b;

您正在分配指针,而不是值。f 指针和 b 指针的大小相同(您正在运行的体系结构上的指针大小),因此它们将始终彼此适合而无需切片。对象本身不受此分配的影响,也不会被切片。

但这会导致 'new Foo()' 泄漏。分配后,f 和 b 都将指向“new Bar()”,并且您将没有指向“new Foo()”的指针,您可以使用它来删除它。

我可以建议您使用 std::unique_ptr 而不是原始指针。这将为您删除。

std::unique_ptr<Foo> newInstance()
{
    return new Foo();
}
于 2012-12-20T17:12:28.347 回答