【发布时间】:2019-01-03 12:01:35
【问题描述】:
考虑以下代码:
Struct Base
{
int x;
double y;
}
Struct A : public Base
{
}
Struct B : public Base
{ //here I don't want x (Base::x) to be inherited.
// is there a way to delete it (something like delete Base::x)
}
Struct C : public Base
{
}
什么是完成此类任务的最佳实践? x 应该被A 和C 继承(可能还有很多其他类)所以我不能把它放在Base 的私有部分。我看到的唯一方法是从Base 中删除x 并将其放入A 和C。但应该有另一种方式吧?谢谢。
【问题讨论】:
-
如果
B不应该有Base::x,那么B不应该从Base公开继承。 -
如果
B不需要x,为什么它是Base?也许你有一个“BaseX”和“BaseY”的概念正在努力实现。或者也许它们应该在需要时被包含,而不是继承? -
顺便说一句:为什么投反对票?
-
@doctorlove 考虑一个基类
RestaurantBase,其中有一个成员m_teaspoon。每个餐厅类(Struct ItaliaFood {}、Struct FrenchFood {}等)都继承自RestaurantBase。现在有一些日本餐厅(Struct JapanFood {}),这也是一家餐厅,但没有茶匙。所以我不希望m_teaspoon被继承。但它是一家餐厅,应该继承RestaurantBase的其他100名成员 -
@Gaetan Read Scott Meyors Effective c++ - Item 34. 区分接口继承和实现继承。通过将茶匙作为接口的一部分,您将在基类的子类上强制执行此实现细节。考虑将工具和抽象部分作为界面的一部分。
标签: c++ inheritance