好的wifi和网线同时连接进行测试时,发现每个UTP中都有几根线的长

欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 6176 人关注过本帖
标题:C++中派生类能继承基类的构造函数和析构函数吗?
等 级:论坛游民
帖 子:104
专家分:65
结帖率:31.58%
&&问题点数:0&&回复次数:13&&&
C++中派生类能继承基类的构造函数和析构函数吗?
如题!能否举例体现一下?
搜索更多相关主题的帖子:
等 级:业余侠客
帖 子:85
专家分:248
#include &iostream&
class Person
&&& Person()
&&&&&&&&cout && &Person's constructor is invoked& &&
&&& ~Person()
&&&&&&&&cout && &Person's destructor is invoked& &&
class Employee:public Person
&&& Employee()
&&&&&&&&cout && &Employee's constructor is invoked& &&
&&& ~Employee()
&&&&&&&&cout && &Employee's destructor is invoked& &&
int main()
&&& return 0;
等 级:ID已被封
威 望:30
帖 子:2976
专家分:7697
木有这种说法。
基类是基类的,派生类是派生类的。
你可以去读读《深入C++对象模型》一书。
我们都在路上。。。。。
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
3楼正解,2楼纯属乱讲,之所以会打印出基类构造函数里的字符串,是因为子类构造函数会调用基类的构造函数。
[ 本帖最后由 lz 于
21:24 编辑 ]
My life is brilliant
等 级:业余侠客
帖 子:85
专家分:248
回复 4楼 lz
嗯,受教了。。
来 自:北京
等 级:贵宾
威 望:94
帖 子:6779
专家分:16751
确实是很容易令人混乱的概念。感觉楼主问的好多问题都很犀利。
等 级:业余侠客
帖 子:85
专家分:248
说明LZ看书很认真啊,我就没发现这个问题。
等 级:业余侠客
帖 子:86
专家分:232
构造函数和析构函数不能被继承。
等 级:新手上路
不能,多重继承派生类的构造函数只是在初始化表中包含多个基类构造函数,析构函数更加不能继承
等 级:论坛游民
帖 子:19
专家分:18
当然不能被继承,上课的时候老师还特意强调了!
版权所有,并保留所有权利。
Powered by , Processed in 0.084632 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved为什么这个this是派生类的地址,基类的构造函数却是调用它自己的_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:279,571贴子:
为什么这个this是派生类的地址,基类的构造函数却是调用它自己的收藏
为什么这个this是派生类的地址,基类的构造函数this-&a()却是调用它自己的函数a(),好奇怪?class B {public:B() {cout && &b():this-&&&&this &&a();this-&a();}virtual void a() {cout && &B::a()&&&}};class C :public B{public:C() {cout && &c():this-&& && this &&a();this-&a();}virtual void a() {cout && &C::a()& &&}};int main(){B* b=new C();b = 0;return 0;}
办花旗信用卡
b():this-&B::a()B::a()c():this-&C::a()C::a()
这是输出结果
1,构造函数先构造基类,再构造子类,构造基类时候子类的a还没有呢2,基类的this不就是自己的意思吗?有什么问题呢
这个问题好犀利!首先存在非静态成员方法a()的时候,this-&a()和a()完全一样,应该没有悬念。其他我试着解释一下(是两个猜测,不一定对)可能性1:B类里的this-&a()其实被编译为B::a(),虚方法可能是给在非this的调用时才有动态绑定的。可能性2:C++的编译还是很像C,所有的东西要先声明后调用,你这个全部内联方法,把声明和实现拆开,也许行为不一样。
[N4582/class.cdtor/4] ... When a virtual function is called directly or indirectly from a constructor or from a destructor, including during the construction or destruction of the class’s non-static data members, and the object to which the call applies is the object (call it x ) under construction or destruction, the function called is the final overrider in the constructor’s or destructor’s class and not one overriding it in a more-derived class. ...
你要的设计者的解释:。
构造函数和析构函数中不能实现多态,貌似是个特例
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或博客访问: 327288
博文数量: 350
博客积分: 0
博客等级: 民兵
技术积分: 2488
注册时间:
Linux后台服务器编程。
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
派生类的对象的数据结构是由基类中说明的数据成员和派生类中说明的数据成员共同构成。将派生类的对象中由基类中说明的数据成员和操作所构成的封装体称为基类子对象,它由基类中的构造函数进行初始化。&
构造函数不能够被继承,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。所以,在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。如果派生类中还有子对象时,还应包含对子对象初始化的构造函数。&
派生类构造函数的一般格式如下:
〈派生类名〉():(), ()
派生类构造函数的调用顺序如下:
基类的构造函数 ----------→子对象类的构造函数 ----------→派生类的构造函数&
当对象被删除时,派生类的析构函数被执行。由于析构函数也不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执行构造函数时的顺序正好相反。&
&多重继承的构造函数和析构函数的执行顺序:
//此处不做注释和说明了,看程序能读懂的 &&
class base1 &&
private: &&
& & int x1; &&
public: &&
& & base1(int y1) &&
& & & & x1 = y1; &&
& & & & cout<<"基类1构造函数执行..."<<"x1= "<<x1<< &&
& & ~base1(){cout<<"base1 析构了...\n";} &&
class & &base2 &&
private: &&
& & int x2; &&
public: &&
& & base2(int y2) &&
& & & & x2 = y2; &&
& & & & cout<<"基类2构造函数执行..."<<"x2= "<<y2<< &&
& & ~base2(){cout<<"base2 析构了...\n";} &&
class base3 &&
private: &&
& & int x3; &&
public: &&
& & base3(){cout<<"构造基类3...\n";} &&
& & ~base3() &&
& & & & cout<<"基类3析构了...\n"; &&
//多重继承派生类的构造函数是按照声明的顺序执行的... &&
class derived:public base2,public base1,public base3 &&
private: &&
& & base1 obj1; &&
& & base2 obj2; &&
& & base3 obj3; &&
public: &&
& & derived(int x,int y,int z,int v):base1(x),base2(y),obj1(z),obj2(v) &&
& & & & cout<<"派生类构造函数执行...\n"; &&
& & ~derived(){cout<<"派生类析构函数执行...\n";} &&
int main() &&
& & derived ob(1,2,3,4); &&
& & return 0; &&
阅读(1600) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。C++ 派生类构造函数、析构函数调用 [大三TJB_708] - 博客频道 - CSDN.NET
小西南,大稀烂。
读书就是慢慢地将书里书外想个遍。
分类:-[小西南]-
《C&#43;&#43;面向对象程序设计》第二版 杜茂康 李昌兵
1 派生类构造函数、析构函数描述
作用和形式
派生类可能有多个基类,也可能包括多个对象成员(指本类中的数据成员,此数据成员为某类定义的对象)。在创建派生类对象时,派生类的构造函数除了要负责本类成员的初始化外,还要调用基类和对象成员的构造函数,并向它们传递参数,以完成基类子对象和对象成员的建立和初始化。
派生类只能采用构造函数初始化列表的方向(顺序)【其实类申明和对象申明先决定构造函数的调用顺序】向基类或对象成员的构造函数传递参数,形式如下:
派生类构造函数名(参数表):基类构造函数名(参数表),对象成员1(参数列表),...{
派生类在构造函数初始化列表(在派生类构造函数中调用基类构造函数和对象成员并传递参数的语句,就是派生类函数名(参数表):后面的语句列表,把这些语句看成列表)中为基类和对象成员的构造函数初&#20540;。当用派生类定义对象时,程序首先调用基类构造函数;接下来构造对象成员(1),最后调用派生类的构造函数。
2 派生类构造函数必需与否
在基类没有任何构造函数或者基类具有缺省参数的构造函数时,派生类可以不向基类传递参数甚至不需要构造函数(本类没有需要初始化的数据成员),由C&#43;&#43;系统隐式生成派生类和基类的构造函数并隐式调用;当基类或对象成员所属类只含有带参数的构造函数时,即使派生类本身没有需要初始化的数据也必须定义构造函数对基类或对象的构造函数传递参数。
3 派生类的构造函数只负责直接基类的初始化
C&#43;&#43;标准有一跳规则:如果派生类的基类同时也是另外一个类的派生类,则每个派生类只负责它的直接基类的构造函数调用。
举例,有A,B,C三个类,它们都有构造函数这个成员函数。其关系如图1
图1.类派生类后又派生类
当由类C定义对象时,构造函数调用的次序为:C的基类B的构造函数被调用;在调用B的构造函数时,由于B又是由类A派生的,所以先调用A的构造函数;然后回溯到A的派生类B,最后回溯到B的派生类C。B和C的构造函数是在回溯中被调用的。
4 构造函数的调用时间和次序
当派生类具有多个基类和多个成员对象时,它们的构造函数将在创建派生类对象时被调用,调用次序如下:
基类构造函数--&对象成员构造函数--&派生类构造函数
当有多个基类时,将按照它们继承方式中的声明次序调用。当有多个对象成员时,将按它们在派生类中的声明次序调用。当构造函数初始化列表的基类和对象成员的构造函数调用完成之后,才执行派生类构造函数体中的代码。如果某个对象成员没有在派生类构造函数的初始化列表中,则编译器会自动为其对象构造(对应类为缺省参数即无参数),调用对应构造函数的顺序跟对象被申明的对象相同。
5 构造函数调用次序例子
#include &iostream&
A (int i=0) {
cout &&&A------&&&x&&end1;
cout &&&B----------&&&y&&end1;
class C : public B {
C():a1(2),
cout && &C-----------3&&&end1;
void main()
在main函数中,当派生类C定义对象c时,将按照B-&a0-&a1-&c的次序调用其内的构造函数。尽管C类的构造函数的参数列表方向为a0(A类缺省参数,编译器按照此顺序自动调用a0对象的构造函数)a1,B1,但是对构造函数的调用次序起决定作用的还是申明次序和类继承关系。所以此程序的执行结果如下:
B----------1
A------0 //编译器自动调用a0的构造函数构造对象a0
C-----------3
这次的笔记将会为理解MFC程序执行流程带去铺垫。
此次笔记记录完毕。
排名:第562名
(3)(424)

我要回帖

更多关于 we八小时网线大战 的文章

 

随机推荐