关于C++基类和派生类的一道程序题
#include<iostream>usingnamespacestd;classP{public:P(intp1,intp2){pri1=p1;pri2=p2;}int...
#include <iostream>
using namespace std;
class P
{
public:
P(int p1,int p2){pri1=p1;pri2=p2;}
int inc1(){return ++pri1;}
int inc2(){return ++pri2;}
void display(){cout<<"pri1="<<pri1<<",pri2="<<pri2<<endl;}
private:
int pri1,pri2;
};
class D1:private P
{
public:
D1(int p1,int p2,int p3):P(p1,p2)
{
pri3=p3;
}
int inc1(){return P::inc1();}
int inc3(){return ++pri3;}
void display()
{
P::display();
cout<<"pri3="<<pri3<<endl;
}
private:
int pri3;
};
class D2:public P
{
public:
D2(int p1,int p2,int p4):P(p1,p2)
{
pri4=p4;
}
int inc1()
{
P::inc1();
P::inc2();
return P::inc1();
}
int inc4(){return ++pri4;}
void display()
{
P::display();
cout<<"pri4="<<pri4<<endl;
}
private:
int pri4;
};
class D12:private D1,public D2
{
public:
D12(int p11,int p12,int p13,int p21,int p22,int p23,int p):D1(p11,p12,p13),D2(p21,p22,p23)
{
pri12=p;
}
int inc1()
{
D2::inc1();
return D2::inc1();
}
int inc5()
{
return ++pri12;
}
void display()
{
cout<<"D2::display()\n";
D2::display();
cout<<"pri12="<<pri12<<endl;
}
private:
int pri12;
};
void main()
{
D12 d(1,2,3,4,5,6,7);
d.display();
cout<<endl;
d.inc1();
d.inc4();
d.inc5();
d.D12::inc1();
d.display();
}
/*
输出的结果是
——————————————————————
D2::display()
pri1=4,pri2=5
pri4=6
pri12=7
D2::display()
pri1=12,pri2=9
pri4=7
pri12=8
Press any key to continue
——————————————————————
*/
我很想知道,在程序中没有出现p1,p2,p3的情况下,为什么程序还能正确运行? 展开
using namespace std;
class P
{
public:
P(int p1,int p2){pri1=p1;pri2=p2;}
int inc1(){return ++pri1;}
int inc2(){return ++pri2;}
void display(){cout<<"pri1="<<pri1<<",pri2="<<pri2<<endl;}
private:
int pri1,pri2;
};
class D1:private P
{
public:
D1(int p1,int p2,int p3):P(p1,p2)
{
pri3=p3;
}
int inc1(){return P::inc1();}
int inc3(){return ++pri3;}
void display()
{
P::display();
cout<<"pri3="<<pri3<<endl;
}
private:
int pri3;
};
class D2:public P
{
public:
D2(int p1,int p2,int p4):P(p1,p2)
{
pri4=p4;
}
int inc1()
{
P::inc1();
P::inc2();
return P::inc1();
}
int inc4(){return ++pri4;}
void display()
{
P::display();
cout<<"pri4="<<pri4<<endl;
}
private:
int pri4;
};
class D12:private D1,public D2
{
public:
D12(int p11,int p12,int p13,int p21,int p22,int p23,int p):D1(p11,p12,p13),D2(p21,p22,p23)
{
pri12=p;
}
int inc1()
{
D2::inc1();
return D2::inc1();
}
int inc5()
{
return ++pri12;
}
void display()
{
cout<<"D2::display()\n";
D2::display();
cout<<"pri12="<<pri12<<endl;
}
private:
int pri12;
};
void main()
{
D12 d(1,2,3,4,5,6,7);
d.display();
cout<<endl;
d.inc1();
d.inc4();
d.inc5();
d.D12::inc1();
d.display();
}
/*
输出的结果是
——————————————————————
D2::display()
pri1=4,pri2=5
pri4=6
pri12=7
D2::display()
pri1=12,pri2=9
pri4=7
pri12=8
Press any key to continue
——————————————————————
*/
我很想知道,在程序中没有出现p1,p2,p3的情况下,为什么程序还能正确运行? 展开
1个回答
展开全部
D12(int p11,int p12,int p13,int p21,int p22,int p23,int p):D1(p11,p12,p13),D2(p21,p22,p23)
这里D12这个派生类已经调用了基类D1,D2的构造函数,这样D1的构造函数会设置p3并调用P的构造函数设置p1,p2,但是同样D2的构造函数也会调用P的构造函数来设置p1,p2。
所以实际上,d这个对像存在两个p对象,其中一个是d1的,另一个是d2的,但是由于你的display方法是调用的d2的display,而d2的display只会显示d2的p中的p1,p2的值。因此就是4,5.
如果你在D12::display当中再添加 D1::display则显示结果如下:
D2::display()
pri1=4,pri2=5
pri4=6
D1::display()
pri1=1,pri2=2
pri3=3
pri12=7
D2::display()
pri1=12,pri2=9
pri4=7
D1::display()
pri1=1,pri2=2
pri3=3
pri12=8
这里D12这个派生类已经调用了基类D1,D2的构造函数,这样D1的构造函数会设置p3并调用P的构造函数设置p1,p2,但是同样D2的构造函数也会调用P的构造函数来设置p1,p2。
所以实际上,d这个对像存在两个p对象,其中一个是d1的,另一个是d2的,但是由于你的display方法是调用的d2的display,而d2的display只会显示d2的p中的p1,p2的值。因此就是4,5.
如果你在D12::display当中再添加 D1::display则显示结果如下:
D2::display()
pri1=4,pri2=5
pri4=6
D1::display()
pri1=1,pri2=2
pri3=3
pri12=7
D2::display()
pri1=12,pri2=9
pri4=7
D1::display()
pri1=1,pri2=2
pri3=3
pri12=8
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询