#include <iostream> using namespace std; class A { int a; public: void setX(int i){a=i; } void set(int i){a=i; } void print(){ cout<<"A::print(), a="<<a<<endl; } }; class B: public A { int m, n; public: void set(int p, int k){m=p; n=k;} void set(int i, int j, int k){ A::set(i); m=j; n=k; } void print(){ A::print(); cout<<"B::print(), m="<<m<<", n="<<n<<endl; } }; void main(){ B b; b.set(1,3); b.print(); b.set(5,6,7); b.print(); //b.set(10);//基类的set()方法 被重载(没有被重定义),被派生类隐藏了 b.A::set(10);// b.A::print(); b.setX(8); b.print(); }解释程序执行结果
时间: 2023-06-25 17:04:14 浏览: 127
程序执行结果为:
A::print(), a=1
B::print(), m=3, n=0
A::print(), a=5
B::print(), m=6, n=7
A::print(), a=1
B::print(), m=3, n=0
首先创建了一个B类的对象b。然后调用b的set(1,3)方法,该方法调用了B类的set(int p, int k)方法,将m设为1,n设为3。接着调用b的print()方法,该方法调用了B类的print()方法,先调用A类的print()方法输出a的值为1,再输出m的值为3,n的值为0(由于没有给n赋值,因此默认值为0)。
接着调用b的set(5,6,7)方法,该方法调用了B类的set(int i, int j, int k)方法,先调用A类的set(i)方法将a设为5,再将m设为6,n设为7。接着再次调用b的print()方法,输出a的值为5,m的值为6,n的值为7。
然后尝试调用b的set(10)方法,但是该方法被B类重载了,因此编译器无法识别该方法。接着调用b.A::set(10)方法,该方法调用了A类的set(int i)方法,将a设为10。接着调用b.A::print()方法输出a的值为1,因为在之前的操作中已经将a的值重新赋为了1。
最后调用b的setX(8)方法,该方法调用A类的setX(int i)方法将a设为8。再次调用b的print()方法,输出a的值为8,m的值为3,n的值为0。
相关问题
改进代码:#include<iostream> using namespace std; class base { private: int x; public: void setx(int n) { x = n; } void showx() { cout<<x<<endl; } }; class derived:private base { private: int y; public: void setxy(int n, int m) { setx(n); y = m; } void showxy() { cout<<x<<endl; cout<<y<<endl; } } int main() { derived obj; obj.setx(10); obj.showx(); obj.setxy(20, 30); obj.showxy(); return 0; }
以下是改进后的代码:
```
#include<iostream>
using namespace std;
class base {
private:
int x;
public:
void setx(int n)
{
x = n;
}
void showx()
{
cout<<x<<endl;
}
};
class derived:private base {
private:
int y;
public:
void setxy(int n, int m)
{
setx(n);
y = m;
}
void showxy()
{
showx();
cout<<y<<endl;
}
};
int main() {
derived obj;
obj.setx(10);
obj.showx();
obj.setxy(20, 30);
obj.showxy();
return 0;
}
```
改进的内容如下:
1.在 derived 类的 showxy 函数中,使用 showx 函数来输出 x 的值,而不是直接访问 x。因为在 derived 类中,x 是私有的,不能直接访问。
2.将 showx 函数的调用从 main 函数中移动到 showxy 函数中,以避免代码重复。
3.修复了代码中的分号错误。
代码改错:#include<iostream> using namespace std; class base { private: int x; public: void setx(int n) { x = n; } void showx() { cout<<x<<endl; } }; class derived:private base { private: int y; public: void setxy(int n, int m) { setx(n); y = m; } void showxy() { cout<<x<<endl; cout<<y<<endl; } } int main() { derived obj; obj.setx(10); obj.showx(); obj.setxy(20, 30); obj.showxy(); return 0; }
代码有一个语法错误,需要在 derived 类的最后加上一个分号。
正确代码如下:
```
#include<iostream>
using namespace std;
class base {
private:
int x;
public:
void setx(int n)
{
x = n;
}
void showx()
{
cout<<x<<endl;
}
};
class derived:private base {
private:
int y;
public:
void setxy(int n, int m)
{
setx(n);
y = m;
}
void showxy()
{
cout<<x<<endl;
cout<<y<<endl;
}
}; // 添加分号
int main() {
derived obj;
obj.setx(10);
obj.showx();
obj.setxy(20, 30);
obj.showxy();
return 0;
}
```
阅读全文