假设我有两个班, 一个是:
class A{
public:
void f1()
{
cout << "function 1";
}
void f2()
{
cout << "function 2";
}
void f3()
{
cout << "function 3";
}
};
现在我希望课程B
包含A
除f3
以外的所有功能。
class B: public A
{
private:
void f3()
{
}
};
据我所知,B::f3()
隐藏了A::f3()
的定义,而B::f3()
是私有的,f3()
无法通过班级B
访问。但我仍然可以这样称呼:
B var();
var.A::f3();
有什么方法可以使用继承而不更改类f3
从B
类隐藏A
?
答案 0 :(得分:9)
您应该不要B
继承A
。
如果B
缺少A
的某些功能,那么B
和A
就没有 is-a 关系,继承意图建模(以及客户期望的)。您应该使用组合:引入类型为B
的{{1}}成员。
答案 1 :(得分:9)
不要养成通过混合和匹配类似于你想要的类来继承拼接类的习惯。这会导致糟糕的代码。
然而,偶尔通过另一个类实现一个类是有意义的。在这些情况下,如果您使用的是继承,那么“正确”的方法是使用私有继承。
“正确”是指最可接受的方式。
class A
{
public:
void f1()
{
cout << "function 1";
}
void f2()
{
cout << "function 2";
}
void f3()
{
cout << "function 3";
}
};
class B: private A
{
public:
using A::A; // use A's constructors
using A::f1;
using A::f2;
// do not use f3
};
这可能有意义的时候是因为所涉及的方法数量太多而且构图太繁琐了。
答案 2 :(得分:4)
你可能会欺骗私人继承
class B : private A
{
public:
using A::f1;
using A::f2;
};