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
a
Base
不需要
x
,为什么它是
a
Base
?也许您有一个“
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的原则,因此,它不太可能成为该语言在继承实现中所迎合的用例。你基本上陷入了困境,但更糟的是:“食物”没有理由成为一种“餐馆”。