考虑以下代码:
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
的私有部分中。我看到的唯一方法是从x
中删除Base
并将其放在A
和C
中。但是应该有另一种方法吗?谢谢。
答案 0 :(得分:2)
公共继承建立了is-a
关系。这意味着B
是 Base
。这意味着如果Base
具有x
,则由于B
是 Base
,因此B
将具有x
。如果您有此问题,则需要重新考虑此设计。考虑将B
和Base
之间的关系切换为合成:
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