注册 登录
编程论坛 C++教室

[求助]派生类问题

xbw0114 发布于 2007-09-18 07:08, 705 次点击
#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();
}
帮忙找一下错误,再帮忙解释一下程序,我不太明白
12 回复
#2
远去的列车2007-09-18 08:14
难受
#3
xbw01142007-09-18 09:58
??
#4
xbw01142007-09-18 16:19

急急啊,有人知道吗?

#5
heyyroup2007-09-18 16:47
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吧
我也是新手,不过在编译的时候你对着下面的错误再找啊,这么长的代码,看得头都晕了
#6
heyyroup2007-09-18 16:58
还有这里
int inc1 ()
{
P::inc1();
P::inc1();
return P::inc1();//大括号不匹配
把上面的几个错误改正以后,VC6.0编译通过。
这些错误在VC的提示下很好找的,我觉得完全可以自己找出来。因为象我这样菜的人都找到了,
#7
xbw01142007-09-18 17:46

多谢,我修改好了,有谁能帮忙具体解释下该程序吗?
正确代码如下:
#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();
}

#8
heyyroup2007-09-18 18:30
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

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

如果不知道该调用哪个函数,可以设置断点,然后单步执行,这样很快就知道程序完成的结果了
#9
heyyroup2007-09-18 19:13
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


我是第一次这么认真去分析一个程序。感觉好累啊,说的不好的地方希望多多包含
#10
xbw01142007-09-18 20:46
感动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编辑过]

#11
xbw01142007-09-19 07:51
有谁知道正解吗~~~
#12
ydq12007-09-19 11:56

拜托 先学习下格式 把函数实现部分写在类外吧 这样看起整眼睛啊

#13
xbw01142007-09-19 15:37
1