0
点赞
收藏
分享

微信扫一扫

7-5 A是A1的虚基类 (15 分)

一只1994 2022-04-24 阅读 103
c++

        本题目要求读入3个整数A、B和C,然后按照下列要求完成相关设计:1.定义一个基类A,在其中包含保护的数据成员int i,设计类A的带参构造函数对i进行初始化,定义成员函数display()显示i值; 2.定义基类A的公有派生类A1,且A是A1的虚基类;A1中包含保护的数据成员int j,设计类A1的构造函数; 3.定义基类A的公有派生类A2,且A是A2的虚基类;A2中包含保护的数据成员int k,设计类A2的构造函数; 4.定义类A3,A3是A1和A2以多继承方式生成的公有派生类,设计类A3的构造函数;定义成员函数disp()在其中调用display()函数显示i值,另外输出j和k值; 5.在main()中定义类A3的1个对象变量,通过输入的3个整数完成对象的创建;调用类A3的成员函数disp()输出信息。

1 2 3

输出样例:

Call A:i=1
Call A1:i=1
Call A2:i=1
Call A3:i=1
i=1
j=2
k=3
#include<iostream>

using namespace std;
//
class A
{
	protected:
		int i;
	public:
		A()
		{
		}
		A(int _i):i(_i)
		{
			cout<<"Call A:i="<<_i<<endl;
		}
		void display();
};
void A:: display()
{
	cout<<"i="<<i<<endl;
}
//
class A1: public A
{
	protected:
		int j;
	public:
		A1(int _i, int _j):A(_i), j(_j)
		{
			cout<<"Call A1:i="<<_i<<endl;
		}
};
class A2: public A
{
protected:
	int k;
public:
	A2(int _i, int n);
};
A2 :: A2(int _i, int n)
	{
		k = n;
		cout<<"Call A2:i="<<_i<<endl;
	}
//
class A3:  public A2,  public A1
{
	public:
		A3(int _i, int _j, int _k):  A1(_i,_j),A2(_i, _k)
		{
			cout<<"Call A3:i"<<_i<<endl;
		}
		void disp();
};
void A3 :: disp()
{
	disp();
	cout<<"j="<<j<<endl;
	cout<<"k="<<k<<endl;
}
int main()
{
	int i,j,k;
	cin>>i>>j>>k;
	A3 b(i,j,k);
	b.disp();
	return 0;
}

my first cout:1.call的顺序错误,2.virtual没有用好,导致A进行两次有参构造,3.对间接基类构造函数的应用错误 

1.交换了A3的有参构造函数中参数列表中A2与A1的顺序,但结果仍然与样例不符 ;交换了定义类A1与类A2的顺序,但结果仍然与样例不符; 交换了定义类A3时,继承类A1和类A2的顺序,结果与样例相符 

2.在声明disp()函数时,在调用display()函数时,编写错误,使函数进入无限循环,修改后出现:[Error] reference to 'display' is ambiguous; 改为在主函数中通过对象,调用A中的display()函数,结果:Error] request for member 'display' is ambiguous

3.在A3中使用using A :: A,结果无法从间接基类继承构造函数

举报

相关推荐

0 条评论