Sai*_*aif 5 c++ inheritance visual-c++ c++11
假设我有两个类,一个是:
class A{
public:
void f1()
{
cout << "function 1";
}
void f2()
{
cout << "function 2";
}
void f3()
{
cout << "function 3";
}
};
Run Code Online (Sandbox Code Playgroud)
现在我希望class B包含Aexcept的所有函数f3.
我在做的是:
class B: public A
{
private:
void f3()
{
}
};
Run Code Online (Sandbox Code Playgroud)
据我所知,B::f3()是隐藏的定义A::f3(),并且B::f3()是私有的,f3()无法通过类访问B.但我仍然可以这样称呼:
B var();
var.A::f3();
Run Code Online (Sandbox Code Playgroud)
有什么办法,我可以完全隐藏f3从类B使用继承和不改变类A?
你应该不会让B继承A.
如果B缺少某些功能A,那么B并且A没有继承意图建模的is-a关系(以及哪些客户端会期望).你应该使用组合:引入一个B类型的成员A.
不要养成通过混合和匹配类似于你想要的类来通过继承将类拼接在一起的习惯.这会导致糟糕的代码.
但是,偶尔通过另一个类实现一个类是有意义的.在这些情况下,如果您使用继承,那么"正确"的方法是使用私有继承.
而"正确"是指最可接受的方式.
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
};
Run Code Online (Sandbox Code Playgroud)
这可能有意义的时候是因为所涉及的方法数量太多,因此组成过于繁琐.