include <iostream> using namespace std; class Bclass { public: Bclass( int i, int j ) { x = i; y = j; } int fun() { return 0; } protected: int x, y; }; class Iclass: public Bclass { public : Iclass(int i, int j, int k):Bclass(i, j) { z = k; } int fun() { return ( x + y + z ) / 3; } private : int z; }; int main() { Iclass obj( 2, 4, 10 ); Bclass p1 = obj; cout << p1.fun() << endl; Bclass &p2 = obj; cout << p2.fun() << endl; cout << obj.fun() << endl; Iclass *p3 = &obj; cout << p3-> fun() << endl; }帮我解释一下这个怎么运行输出的
时间: 2024-04-01 09:37:24 浏览: 68
这段代码是一个简单的继承和多态的示例,主要包含了一个基类 Bclass 和一个派生类 Iclass,在主函数中创建了一个 Iclass 的对象 obj,并通过不同的方式调用了对象的成员函数 fun()。下面是代码的具体运行输出解释:
1. Bclass p1 = obj; cout << p1.fun() << endl;
这一行代码中,将派生类对象 obj 赋值给了基类对象 p1,这里会发生对象切割,只保留了 Bclass 的部分成员变量,而忽略了 Iclass 中新增的成员变量 z。接着调用了基类中的 fun() 函数,该函数返回 0,因此输出结果为 0。
2. Bclass &p2 = obj; cout << p2.fun() << endl;
这一行代码中,将派生类对象 obj 的地址赋值给了基类对象的引用 p2,由于使用的是引用,因此不会发生对象切割,可以调用派生类中覆盖了基类的 fun() 函数,该函数返回 (x+y+z)/3,因此输出结果为 5。
3. cout << obj.fun() << endl;
这一行代码中,直接调用派生类对象 obj 的成员函数 fun(),同样会调用覆盖了基类的 fun() 函数,输出结果为 5。
4. Iclass *p3 = &obj; cout << p3-> fun() << endl;
这一行代码中,将派生类对象 obj 的地址赋值给了派生类指针 p3,通过指针访问对象的成员函数 fun(),同样调用覆盖了基类的 fun() 函数,输出结果为 5。
因此,最终的输出结果为:
0
5
5
5
相关问题
补全程序,并写出程序运行结果。 #include <iostream> using namespace std; class Class { public : Class ( int...
补全程序如下:
```
#include <iostream>
using namespace std;
class Class {
public:
Class(int a, int b, int c) {
x = a;
y = b;
z = c;
}
void print() {
cout << "x: " << x << endl;
cout << "y: " << y << endl;
cout << "z: " << z << endl;
}
private:
int x;
int y;
int z;
};
int main() {
Class obj(1, 2, 3);
obj.print();
return 0;
}
```
程序运行结果为:
```
x: 1
y: 2
z: 3
```
程序定义了一个名为 Class 的类,该类包括有参构造函数和一个 print() 函数,构造函数用于对类的私有成员变量进行初始化,print() 函数用于输出类的私有成员变量。在主函数 main() 中,创建了一个名为 obj 的 Class 类对象,构造函数传入三个整数参数 1、2 和 3。最后调用 obj 对象的 print() 函数,输出 obj 对象的私有成员变量 x、y 和 z 的值。
#include<iostream> using namespace std; class C { public: C(int a) { x = a; } private: int x; }; class D :public C { public: D(int a):y(a){} private: int y; }; 指出错误,并说明原因
在类D的构造函数中,没有显式调用基类C的构造函数,因为类D是从类C派生而来的。因为类C没有默认构造函数,所以必须显式调用基类C的构造函数并传递参数。所以错误的行为是在类D的构造函数中未显式调用基类C的构造函数。
正确的代码应该是这样的:
```cpp
#include <iostream>
using namespace std;
class C {
public:
C(int a) { x = a; }
private:
int x;
};
class D : public C {
public:
D(int a, int b) : C(a) { y = b; }
private:
int y;
};
int main() {
D d(1, 2);
return 0;
}
```
在类D的构造函数中,我们显式调用了基类C的构造函数并传递了参数a,这样,类D就可以正确地初始化基类C的成员变量x。
阅读全文