这个问题是关于类的继承中 构造函数与析构函数的问题

qq6287976 2009-06-07 09:20:06
class BASE
{ private:
char c;
public:
BASE(char n):c('a'){cout<<n;}
virtual~BASE(){cout<<c;}
};
class DERIVED:public BASE
{ private:
char c;
public:
DERIVED(char n):BASE(n+1),c(n){cout<<n;}
~DERIVED(){cout<<c;}
};
int main()
{ DERIVED obj('X');
return 0;
}
输出为YXXa

问题1:不是先调用基类的构造函数吗 为什么基类的构造函数知道n为Y ?
问题2:为什么基类的构造函数输出n为Y,但其后的析构函数 输出为a? 基类的n 到底是a还是Y?

...全文
56 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq6287976 2009-06-07
  • 打赏
  • 举报
回复
谢谢大家 再复习一下c++primer ....
adventurelw 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qq6287976 的回复:]
还有一点不理解
既然首先构造基类对象,为什么基类的构造函数知道BASE('X' + 1) ,BASE('X' + 1)不是在执行派生类的构造函数时才执行的吗?
到底  构造函数():..这些东东...{}    ,  这些东东 在什么时候执行?
[/Quote]

你用的是初始化列表,当然是在进入派生类构造函数体之前执行BASE('X'+1)啊。
如果你没用初始化列表,编译器也强制要求在开始构造派生类成员之前生成一个基类对象,也即按照你的定义,如果你
没有初始化列表,因为BASE类没有默认构造函数,则应该出现编译错误。
pengzhixi 2009-06-07
  • 打赏
  • 举报
回复

class BASE
{ private:
char c;
public:
BASE(char n):c('a'){cout < <n;}
virtual~BASE(){cout < <c;}
};
class DERIVED:public BASE
{ private:
char c;
public:
DERIVED(char n):BASE(n+1),c(n){cout < <n;} //BASE(n+1)这里让它知道了c的值为Y
~DERIVED(){cout < <c;}
};
int main()
{ DERIVED obj('X');
return 0;
}
输出为YXXa
问题1:不是先调用基类的构造函数吗 为什么基类的构造函数知道n为Y ?
问题2:为什么基类的构造函数输出n为Y,但其后的析构函数 输出为a? 基类的n 到底是a还是Y?
n为'X',n+1为'Y',析构函数输出a是因为你根本没将n+1赋给基类的数据成员c.


LZ你虽然有参数n但是你根本就没修改数据成员c
pathuang68 2009-06-07
  • 打赏
  • 举报
回复
7楼更正:
= 向
pathuang68 2009-06-07
  • 打赏
  • 举报
回复
已经想基类构造函数传递参数了。
kang315 2009-06-07
  • 打赏
  • 举报
回复
通过 主函数对象知道BASE('X'+1)c('Y') 后返回基类 就输出 Y 在是 派生类的 输出 X 在派生类 调用析构函数 输出X 在基类的 由于基类的析构函数为virtual 且定义了C('a')就输出 a了
反正是先基类 在派生类的调用 构造函数
qq6287976 2009-06-07
  • 打赏
  • 举报
回复
还有一点不理解
既然首先构造基类对象,为什么基类的构造函数知道BASE('X' + 1) ,BASE('X' + 1)不是在执行派生类的构造函数时才执行的吗?
到底 构造函数():..这些东东...{} , 这些东东 在什么时候执行?
adventurelw 2009-06-07
  • 打赏
  • 举报
回复
这个,基类构造函数中输出的是构造函数的参数,你既然以'X'+1为其实参,当然就该为'Y'啊
DERIVED obj('X');//构造obj对象时,首先构造基类对象,BASE('X' + 1)
你析构函数输出的是数据成员c,你在基类的构造函数中将其初始化为'a',自然就是'a',与n(也就是你传递的参数值)没有一点关系啊。
piaoliu 2009-06-07
  • 打赏
  • 举报
回复
DERIVED(char n):BASE(n+1),c(n){cout < <n;}

这一句先调用基类的构造函数,传入参数为n+1,这里就是'X'+1 = 'Y'

BASE(char n):c('a'){cout < <n;}
base的析构函数输出的成员c,c在构造时赋值为'a'
goodname 2009-06-07
  • 打赏
  • 举报
回复
BASE(char n):c(n){cout <<n;} //这里将'a'改为n
goodname 2009-06-07
  • 打赏
  • 举报
回复
1
初始化列表中你使用了BASE(n+1),这个n+1就是'X'+1=='Y',这个值直接在基类构造函数中被输出了。
2
你在基类构造函数中并没有把参数c给保存下来,而是直接保存了'a'

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧