标题:[求助]派生类问题
只看楼主
xbw0114
Rank: 1
等 级:新手上路
帖 子:141
专家分:0
注 册:2007-8-8
 问题点数:0 回复次数:12 
[求助]派生类问题
#include <iostream.h>
class P
{
public :
P(int p1,int p2)
{
pri1=p1;
pri2=p2;
}
int inc1 ()
{
return ++pri1;
}
int inc2()
{
return ++pri2;
}
void disp ()
{
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=p4;
}
int inc1()
{
return P::inc1();
}
int inc3()
{
return ++pri3;
}
void disp()
{
P::disp();
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::inc1();
return P::inc1();
int inc4()
{
return ++pri4;
}
void disp ()
{
P::disp();
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):D(p11, p12 ,p13),D(p21,p22,p23)
{
pri12=p;
}
int inc1()
{
D2::inc1();
return D2::inc1();
return D2::inc1();
}
int inc5()
{
return ++pri12;
}
void disp ()
{
cout<<"D2::disp()"<<endl;
D2::disp();
cout<<"pri12="<<pri12<<endl;
}
private:
int pri12;
};
void main ()
{
D12 d(1,2,3,4,5,6,7);
d.disp();
d.inc1();
d.inc4();
d.inc5();
d.D12::inc1();
d.disp();
}
帮忙找一下错误,再帮忙解释一下程序,我不太明白
搜索更多相关主题的帖子: private include public return 
2007-09-18 07:08
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
得分:0 
难受

C++学习
2007-09-18 08:14
xbw0114
Rank: 1
等 级:新手上路
帖 子:141
专家分:0
注 册:2007-8-8
得分:0 
??

勤奋造就未来
2007-09-18 09:58
xbw0114
Rank: 1
等 级:新手上路
帖 子:141
专家分:0
注 册:2007-8-8
得分:0 

急急啊,有人知道吗?


勤奋造就未来
2007-09-18 16:19
heyyroup
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2006-6-14
得分:0 
D1(int p1,int p2,int p3):P(p1,p2)
{
pri3=p4;//p4未定义
}
D2(int p1,int p2,int p4):P(p1,p2)
}//符号错了
pri4=p4;
}
D12 (int p11,int p12,int p13,int p21,int p22,int p23,int p):D(p11, p12 ,p13),D(p21,p22,p23)//这里该是D1,D2吧
我也是新手,不过在编译的时候你对着下面的错误再找啊,这么长的代码,看得头都晕了
2007-09-18 16:47
heyyroup
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2006-6-14
得分:0 
还有这里
int inc1 ()
{
P::inc1();
P::inc1();
return P::inc1();//大括号不匹配
把上面的几个错误改正以后,VC6.0编译通过。
这些错误在VC的提示下很好找的,我觉得完全可以自己找出来。因为象我这样菜的人都找到了,
2007-09-18 16:58
xbw0114
Rank: 1
等 级:新手上路
帖 子:141
专家分:0
注 册:2007-8-8
得分:0 

多谢,我修改好了,有谁能帮忙具体解释下该程序吗?
正确代码如下:
#include <iostream.h>
class P
{
public :
P(int p1,int p2)
{
pri1=p1;
pri2=p2;
}
int inc1 ()
{
return ++pri1;
}
int inc2()
{
return ++pri2;
}
void disp ()
{
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 disp()
{
P::disp();
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 disp ()
{
P::disp();
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();
return D2::inc1();
}
int inc5()
{
return ++pri12;
}
void disp ()
{
cout<<"D2::disp()"<<endl;
D2::disp();
cout<<"pri12="<<pri12<<endl;
}
private:
int pri12;
};
void main ()
{
D12 d(1,2,3,4,5,6,7);
d.disp();
d.inc1();
d.inc4();
d.inc5();
d.D12::inc1();
d.disp();
}


勤奋造就未来
2007-09-18 17:46
heyyroup
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2006-6-14
得分:0 
D12 d(1,2,3,4,5,6,7);//此时d中的七个数据成员分别被赋值,从D1中继承的pri1=1,pri2=2,pri3=3;
//从D2中继承的pri1=4,pri2=5,pri3=6,
//D12的数据成员pri4=7
d.disp();//D12的disp()(输出D2::disp())
---> 然后调用D2类中的disp()
---> 调用P类中的disp() 输出pri1=4,pri2=5(注意看红色字体)
---> 执行D2.disp()函数中的语句cout<<"pri4="<<pri4<<endl 输出pri4=6
---> 调用基类的函数完成,回到D12.diap()函数,执行cout<<"pri12="<<pri12<<endl 输出pri12=7

以下的代码你可以这样一步步的找。多花点时间就会了,其实很简单的

如果不知道该调用哪个函数,可以设置断点,然后单步执行,这样很快就知道程序完成的结果了
2007-09-18 18:30
heyyroup
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2006-6-14
得分:0 
d中的数据成员为(1,2,3,4,5,6,7)
d.disp();
d.inc1();//执行D12类中定义的inc1()函数
--》执行D2.inc1()函数--》执行P.inc1()函数,将对象d中的第一个数据成员加1(此时d为(1,2,3,5,5,
6,7))在D2.inc1()函数中3次调用P.inc1()函数,所以当D2.inc1()函数调用完成后d的数据变为
(1,2,3,7,5,6,7)
--》执行D12.inc1()函数中的return D2::inc1(),执行过程通上,当完成函数调用后d中的数据变为
(1,2,3,10,5,6,7)
--》回到D12.inc1()函数,执行return D2::inc1(),当完成函数调用以后d中的数据变为
(1,2,3,10,5,6,7)
d.inc4();//执行从D2中继承过来的函数D2.inc4(),将D2部分的pri4(也就是对象d中的第6个数据,此时为6)加1,变为7
,到此,d中的数据变为(1,2,3,10,5,7,7)
d.inc5();//执行D12中定义的函数D12.inc5(),将D12部分的pri12(也就是对象d中的第7个成员,此时为7)加1,变为8
到此,d中的数据成员变为(1,2,3,10,5,7,8)
d.D12::inc1();//再一次调用d.inc1(),同红色字体,执行完成以后d中的数据变为(1,2,3,16,5,7,8)
d.disp(); //再一次调用disp()函数
输出D2::disp()
pri1=16,pri2=5;
pri4=7
pri12=8


我是第一次这么认真去分析一个程序。感觉好累啊,说的不好的地方希望多多包含
2007-09-18 19:13
xbw0114
Rank: 1
等 级:新手上路
帖 子:141
专家分:0
注 册:2007-8-8
得分:0 
感动ing~~~真是太感谢了~~~
但是好像输出的结果是
D2::disp()
pri1=4,pri2=5
pri4=6
pri12=7
D2::disp()
pri1=12,pri3=9
pri4=7
pri12=8
是哪里出现了错误呢?

[此贴子已经被作者于2007-9-18 21:13:59编辑过]


勤奋造就未来
2007-09-18 20:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-170771-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030030 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved