C++ c++;删除子类中继承的成员变量
考虑以下代码:C++ c++;删除子类中继承的成员变量,c++,inheritance,C++,Inheritance,考虑以下代码: 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
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
。但应该有另一种方法,对吗?谢谢。公共继承建立了一种is-a
关系。这意味着B
是一个基础。这意味着如果Base
有x
,那么既然B
是Base
,B
将有x
。如果你有这个问题,你需要重新考虑这个设计。考虑转换<代码> B<代码>与<代码> BASE<代码>组成:
struct B {
void some_function_using_base();
private:
Base base_;
};
无法“删除”继承的数据成员,甚至无法隐藏它们。它们得到子类的固有部分。
如果B
只继承Base
的一部分,则需要拆分Base
:
Struct Base
{
double y;
}
Struct BaseWithX : public Base
{
int x;
}
Struct A : public BaseWithX
{ }
Struct B : public Base
{ }
Struct C : public BaseWithX
{ }
就隐藏基类的成员而言,您可以通过私下从基类继承并使用和有选择地公开公共(或受保护)基类成员来实现这一点:
Struct Base
{
int x;
double y;
}
Struct A : public Base
{
}
Struct B : private Base
{
using Base::x; // only pull in x in the public section of the class
}
...
B b;
double y = b.y // <= compilation error here
Struct Base
{
int x;
双y;
}
结构A:公共基础
{
}
结构B:私有基
{
使用Base::x;//仅在类的公共部分拉入x
}
...
B B;
双y=b.y//如果b
不应该有Base::x
,那么b
就不应该从Base
公开继承。如果b
aBase
不需要x
,为什么它是aBase
?也许您有一个“BaseX
”和“BaseY
”的概念正在努力实现。或者也许他们应该被包含在需要的时候,而不是继承的?BTW:为什么投票率下降?@博士爱考虑一个基类<代码>餐馆基地< /代码>,它与其他成员中的一个成员<代码> MyTeaspon < /代码>。每个餐厅类(Struct ItaliaFood{}
,Struct FrenchFood{}
等)都继承自RestaurantBase
。现在有一家日本餐馆(Struct JapanFood{}
),也是一家餐馆,但没有茶匙。因此,我不想继承m_teaspoon
。但它是一家餐馆,应该继承《代码》>餐厅的其他100个成员<代码> @盖坦阅读史葛Meor有效C++项目34。区分接口继承和实现继承。通过将茶匙作为接口的一部分,您将在基类的子类上强制执行此实现细节。考虑制作餐具和抽象界面部分。考虑一个基类<代码>餐馆基地< /代码>,其中有一个成员“代码> MyTeasPoon < /C>”。每个餐厅类(Struct ItaliaFood{}
,Struct FrenchFood{}
等)都继承自RestaurantBase
。现在有一家日本餐馆(Struct JapanFood{}
),也是一家餐馆,但没有茶匙。因此,我不想继承m_teaspoon
。但它是一家餐馆,应该继承《代码》>餐厅的其他100个成员<代码> @盖坦阅读史葛Meor有效C++项目34。区分接口继承和实现继承。通过将茶匙作为接口的一部分,您将在基类的子类上强制执行此实现细节。考虑制作<代码>工具<代码>和界面的抽象部分。谢谢Stephan,也许C++ 18应该引入这样的<代码>删除x/COD>,允许部分继承。如果您考虑上面提到的餐厅示例,创建一个新的基类只是为了防止单个成员的继承是很烦人的。variable@Gaetan问题是,您描述的用例并没有真正遵守OOP的原则,因此,它不太可能成为该语言在继承实现中所迎合的用例。你基本上陷入了困境,但更糟的是:“食物”没有理由成为一种“餐馆”。