若类Y是类X的私有派生类,类Z是类Y的公用派生类,则类Z能不能访问类X的公用成员和保护成员。
不能 只要私有继承就所有都不能访问
##2.这一步自然而然的就是将最底层的移到z
##3.那么仔细思考,这和刚开始的图有什么区别?(如果你能看到无非是最大牌子到z了(我们移动其他牌子更不受大盘子的影响),其他的只是所在柱上的名字改了,那么恭喜你接近递归的本质了,你也应该想出第三步了。)就是将y上的牌子移到z。
给你一副图:(和第一幅图对比,这就是汉诺它可以写成递归的原因)
你理解了这些,你就非常容易理解我的源码了:
#include <iostream>
using namespace std;
//函数名?
//函数值返回类型?
//弹栈条件是什么? return?
//怎样调用递归函数?
void move(int n,char x,char z){
cout<<n<<" "<<x<<": move "<<z<<endl;
}
void Hanoi(int n,char x,char y,char z){
if(n==1){
move(n,x,z);
return ;
}
Hanoi(n-1,x,z,y);
move(n,x,z);
Hanoi(n-1,y,x,z);
}
int main(){
char x='x',y='y',z='z';
int n;
cin>>n;
Hanoi(n,x,y,z);//将三个牌子经y有x-->z
system("pause");
}
#附上运行结果:
想了解更多精彩内容,请关注我
对于类的继承关系,C++中使用关键词来实现,例如将Y类定义为X类的私有派生类,则可以使用如下语法:
class Y : private X { //Y的定义 };
同样的,将Z类定义为Y类的公用派生类,则可以使用如下语法:
class Z : public Y { //Z的定义 };
这样定义之后,Z类可以访问Y类的公用成员和保护成员,但无法直接访问X类的成员。如果需要访问X类的成员,需要在Y类中添加公用或保护的成员函数来进行访问,例如:
class Y : private X { public: using X::some_public_member; //将X类的公用成员some_public_member设置为Y类的公用成员 protected: using X::some_protected_member; //将X类的保护成员some_protected_member设置为Y类的保护成员 };
class Z : public Y { public: void access_members_of_X() { some_public_member(); //可以访问Y类的公用成员和保护成员 some_protected_member(); } };
这样,在Z类的成员函数access_members_of_X中就可以访问X类的公用成员和保护成员了。