本题目要求读入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,结果无法从间接基类继承构造函数