【发布时间】:2020-08-24 18:29:57
【问题描述】:
struct A
{};
struct B : A
{
operator A() const = delete; // not work
};
int main()
{
B* p_derived = new B();
delete p_derived; // ok
// How to make the following two lines illegal?
A* p_base = new B();
delete p_base;
}
A的定义不能改变,其析构函数不是virtual;所以B的对象不应该被指向A的指针删除。
我不能使用struct B : protected A {};,因为我希望B 继承A 的所有public 成员并保持它们不变public。
在C++'s mixin patterns,这是一个常见的问题:
这没关系,除非通过指向原始类的指针多态地删除 mixin 类。
我的问题:
如何防止对象通过指向其父类型的指针被删除?
【问题讨论】:
-
你打算如何删除B的实例?
-
如果您无法更改
A,您将无法实现这一目标。我会重新考虑这一点。也许B应该'has-a'A而不是'is-a'A,并删除你删除的类型转换运算符,以及一堆引用A字段的字段。 -
在 C++ 的 mixin 模式中,这是一个常见的问题。 @user207421
-
不,这实际上不是混合模式的常见问题,因为混合和多态删除在实践中很少一起出现。如果需要这样的东西,那么可以使 base/mixin 成为多态的,包括给它一个虚拟析构函数。一般来说,mixin 类并不打算以多态方式使用,因此它们没有虚拟析构函数,也不应该以多态方式删除。
标签: c++ oop design-patterns polymorphism virtual-destructor