删除子类中的继承的成员变量

时间:2019-01-03 12:01:36

标签: 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
{   
}

什么是实现此任务的最佳实践? x应该被AC继承(并且可能被许多其他类继承),所以我不能将其放在Base的私有部分中。我看到的唯一方法是从x中删除Base并将其放在AC中。但是应该有另一种方法吗?谢谢。

3 个答案:

答案 0 :(得分:2)

公共继承建立了is-a关系。这意味着B Base。这意味着如果Base具有x,则由于B Base,因此B将具有x。如果您有此问题,则需要重新考虑此设计。考虑将BBase之间的关系切换为合成:

struct B {
    void some_function_using_base();
private:
    Base base_;
};

答案 1 :(得分:2)

无法“删除”继承的数据成员,甚至无法隐藏它们。它们成为子类的固有部分。 如果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
{ }

答案 2 :(得分:0)

就隐藏基类的成员而言,您可以通过从基类的私有继承并使用using有选择地公开(受保护的)基类成员来实现:

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