我有一个类层次结构,我想禁止这样做:
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
。
答案 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();
}