允许operator =仅在同一类的对象之间使用?

时间:2012-12-20 16:45:36

标签: c++ inheritance assignment-operator private-methods object-slicing

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

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

f = b;

其中FooBar的超类。这样做会切割对象的Bar部分。我知道你可以通过将operator=设为私有来解决这个问题,但如果它们属于不同类型,是否可以禁止使用赋值运算符?

比如将operator=设为私有,但仍允许这样做:

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

b1 = b2;

假设子类也将被Bar

3 个答案:

答案 0 :(得分:4)

既然你在谈论切片,我认为你实际上想要阻止的是:

Foo f;
Bar b;

f = b;

在这种情况下,是的,您可以通过使适当的operator = private来阻止分配。

您无法阻止指针指定,但请注意,指针指定不会导致切片。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

您的示例中不会出现切片:

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

f = b;

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

但这会导致'新Foo()'泄露。在赋值之后,f和b都将指向'new Bar()'并且你没有指向'new Foo()'的指针,你可以用它来删除它。

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

std::unique_ptr<Foo> newInstance()
{
    return new Foo();
}