进来看看,在线等待!!!!!!!!!!!!!

whowho 2003-04-17 03:00:50
#include <iostream>
#include <stdlib.h>
class inbase
{
public:
inbase(int s=0){cout<<"inbase"<<endl;}
inbase(const inbase &){cout<<"copy ing"<<endl;};
};
class base
{
public:
base(int s=0):value(s){cout<<"base"<<endl;};
virtual void display(){cout<<"base"<<value<<endl;};
private:
int value;
inbase ss;
};
class baseone:public base
{
public:
baseone(int s=12):value(s){cout<<"baseone"<<endl;};
void display(){cout<<value<<endl;}
private:
int value;
inbase si;
};
void main()
{
baseone s(12);
cout<<endl;
base s1(s);///?
s1.display();
system("pause");
}
缺省的COPY CONSTRUCTOR 中除 vptr外,是否其他的数据成员按照bitwist copy semantics 完成。如果是的话,那S1.display()应该显示12??????????
...全文
14 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
luohualiushui 2003-04-17
恭喜你!!
理解得很对
  • 打赏
  • 举报
回复
luixui 2003-04-17
什么?
  • 打赏
  • 举报
回复
whowho 2003-04-17
这样理解是不是正确的
我在BASE中加入COPY函数,
base(const base &rs){value=rs.value;ss=rs.ss;};
运行
BASEONE S1(12);
BASE S2(S1),时可以把S1看做BASE加上自己的扩展部分(用S表示),
而S1中包含的BASE未经过初始化,所以调用的是默认的0;
实际base(const base &rs)在运行中调用的是BASE(S)所以S2的VALUE=S.VALUE
结果为0



  • 打赏
  • 举报
回复
luohualiushui 2003-04-17
base s1(s);///?进行的就是按位拷贝
你给得程序是这样运行的:

baseone s(12); //构造s,但是其基类调用的是base(int s=0):value(s){cout<<"base"<<endl;};
cout<<endl;
base s1(s);///编译器运行到这的时候,寻找能把s转为s1的办法,由于base是baseone的基类,编译器把baseone中比base多的东西“切除”,这样就剩下了上面用base(int s=0):value(s)构造出来的base,然后进行按位拷贝,得到了结果--0

s1.display();
system("pause");

  • 打赏
  • 举报
回复
point_to 2003-04-17
base s1(s);用子类给父类来copy,而子类的构造函数并没有给父类进行初始化,或者说,父类还是用自己的默认的值 0给它的数据成员value赋值,那么这个时候,父类的value就是0了,当然,copy时候,s1的value就是0了。

可以这样测试(i have tried。it's ok.):class baseone:public base
{
public:
baseone(int s=12):value(s),base(s){cout<<"baseone"<<endl;}
  • 打赏
  • 举报
回复
whowho 2003-04-17
base s1(s);///?不能进行bitwist copy semantics操作吗?
  • 打赏
  • 举报
回复
luohualiushui 2003-04-17
呵呵
不好意思,程序贴错了
#include <iostream>
#include <stdlib.h>
using namespace std;
class inbase
{
public:
inbase(int s=0){cout<<"inbase"<<endl;}
inbase(const inbase &){cout<<"copy ing"<<endl;};
};
class base
{
public:
base(int s=0):ss(s),value(s){cout<<"base"<<endl;};//成员类没有初始化
virtual void display(){cout<<"base"<<value<<endl;};
private:
int value;
inbase ss;
};
class baseone:public base
{
public:
baseone(int s=12):base(s),value(s){cout<<"baseone"<<endl;};//基类没有初始化,加base(s)
void display(){cout<<value<<endl;}
private:
int value;
inbase si;
};
void main()
{
baseone s(12);
cout<<endl;
base s1(s);///?
s1.display();
system("pause");
}
  • 打赏
  • 举报
回复
luohualiushui 2003-04-17
#include <iostream>
#include <stdlib.h>
class inbase
{
public:
inbase(int s=0){cout<<"inbase"<<endl;}
inbase(const inbase &){cout<<"copy ing"<<endl;};
};
class base
{
public:
base(int s=0):value(s){cout<<"base"<<endl;};
virtual void display(){cout<<"base"<<value<<endl;};
private:
int value;
inbase ss;
};
class baseone:public base
{
public:
baseone(int s=12):value(s){cout<<"baseone"<<endl;};
void display(){cout<<value<<endl;}
private:
int value;
inbase si;
};
void main()
{
baseone s(12);
cout<<endl;
base s1(s);///?
s1.display();
system("pause");
}

你的程序中基类没有初始化,所以默认构造函数把值设为0
记住在初始化列表中把积累和所有的成员类初始化
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2003-04-17 03:00
社区公告
暂无公告