子类子类 拷贝构造函数数为什么不能在函数体重调用父类拷贝

C++拷贝构造函数的几个知识点总结及示例代码_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C++拷贝构造函数的几个知识点总结及示例代码
&&C++中拷贝构造函数的知识点和示例代码
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢静态成员函数
非静态成员函数
赋值操作函数
编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。所以建议的方式是将析构函数声明为虚函数。
也就是delete a的时候,也会执行派生类的析构函数。
一个函数一旦声明为虚函数,那么不管你是否加上virtual 修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual 修饰符。
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。
如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。
构造原则如下:
&&&&1.&如果子类没有定义构造方法,则调用父类的无参数的构造方法。
&&&&2.&如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。
&&&&3.&在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。
&&&&4.&在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。
&&&&5.&在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
&&&&6.&如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,比如:
#include &iostream.h&
class animal
& & animal(int height, int weight)
& & & & cout&&"animal construct"&&
class fish:public animal
& & fish():animal(400,300), a(1)
& & & & cout&&"fish construct"&&
void main()
赋值运算符重载函数
不是不能被派生类继承,而是被派生类的默认
赋值运算符重载函数
给覆盖了。
赋值运算符重载函数不能被派生类继承的真实原因!
简而言之,缺省构造函数,拷贝构造函数,拷贝赋值函数,以及析构函数这四种成员函数被称作特殊的成员函数。这4种成员函数不能被继承
思路:构造函数是不能被继承的,但是可以被调用,如果父类重新定义了构造函数,也就是没有了默认的构造函数,子类创建自己的构造函数的时候必须显式的调用父类的构造函数。而其余的三个在我们平常的使用中都可以被继承使用。
个人认为,构造函数如果被继承了,你想想会发生些什么。是不是私有的成员变量也应该被公有化了,如果不公有化那你继承构造函数也就没有意义了
构造函数是不能被继承的, 背下来。
为什么赋值运算符重载函数不能被继承呢?
因为相较于基类,派生类往往要添加一些自己的数据成员和成员函数,如果允许派生类继承基类的赋值运算符重载函数,那么,在派生类不提供自己的赋值运算符重载函数时,就只能调用基类的,但基类版本只能处理基类的数据成员,在这种情况下,派生类自己的数据成员怎么办?
所以,C++规定,赋值运算符重载函数不能被继承。
我也想说,c++11开始支持非默认构造函数继承了,在派生类中用using声明
构造函数,析构函数 ,赋值运算 =,友元都不能继承C++primer 6
p530更详细
本题答案有问题的,静态成员函数
不会被继承。即使子类调用,也只是个全局调用。故ABD,其实还有拷贝构造函数,析构函数
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。
这道题本身就是有问题的好不好。首先C++11的构造函数可以支持继承了,只不过C++类体系中构造函数在默认情况下还是不支持继承的,出题的人就没点严谨?其次,赋值运算符重载函数可以继承?这么重要的 知识点都能弄错,我也真是服了出题者了。
A.构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。
如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。
B.这其实不叫继承,这是可以全局调用的,静态函数不属于任何一个类的实例,在类被加载的时候,静态函数就会被创建,他的调用是通过类名调用的,所以你用子类类名调用父类静态函数和用父类类名调用这个静态函数完全一样没有任何区别
第一次全对,就在本套试卷最后一题嘚瑟一下吧。。。
静态成员函数怎么说?难道能被继承吗?这题还是有问题吧
静态成员函数
非静态成员函数
赋值操作函数
// 构造函数都是对的,那么赋值构造也是不行了,如果赋值可以,那么赋值构造算啥呢。。。所以,要么都不行,要么都行,,,总之呢,赋值操作函数无法被继承,继承了也被覆盖,覆盖了就用不了,跟没有一样
对于D,赋值操作函数不可以继承。其他运算符重载函数可以。
程序员的必读经典《
Effective C++
》这么说:
在幕后为你所写、所调用的函数
一个空类什么时候不是空类?
编译器通过它的时候。如果你没有声明下列函数,体贴的编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。换句话说,如果你这么写:
class Empty{};
和你这么写是一样的:
class Empty {
// 缺省构造函数
Empty(const Empty& rhs);
// 拷贝构造函数
// 析构函数 ---- 是否
// 为虚函数看下文说明
perator=(const Empty& rhs);
// 赋值运算符
Empty* operator&();
// 取址运算符
const Empty* operator&()
标准规定:
如果派生类中声明的成员与基类的成员同名,那么,基类的成员会被覆盖,哪怕基类的成员与派生类的成员的数据类型和参数个数都完全不同。
赋值运算符重载函数
不是不能被派生类继承,而是被派生类的默认
赋值运算符重载函数
给覆盖了。
赋值运算符重载函数不能被派生类继承的真实原因
为什么C++赋值运算符重载函数不能被继承?
http://www.eetop.cn/blog/html/11/36.html
怎么都没有人回答D啊,赋值函数为什么不能继承
构造函数不能被继承,但是可以被调用。派生类的构造函数在初始化列表中应调用基类的构造函数。
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
浙ICP备号-2
扫一扫,把题目装进口袋小马过河,不知深浅
深拷贝和浅拷贝的定义可以简单理解为:如果一个类拥有资源,当这个类的对象发生了复制过程时候,这个过程叫深拷贝。如果对象存在资源,但复制过程并未复制资源的情况视为浅拷贝。浅拷贝资源的时候产生资源不清的情况导致程序运行出错。
当用一个已经初始化了的自定义类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。
简言之,资源重新分配,这个过程就是深拷贝。反之,没有重新分配资源,就是浅拷贝。
一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
一个对象需要通过另外一个对象进行初始化。
如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数.
这个默认的参数可能为X::X(const
X&)或X::X(X&),由编译器根据上下文决定选择哪一个.
默认拷贝构造函数的行为如下:
&默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造.
&拷贝构造函数对类中每一个数据成员执行成员拷贝(memberwise Copy)的动作.
&a)如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数.
&b)如果数据成员是一个数组,对数组的每一个执行按位拷贝.
&c)如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 java 子类转父类 的文章

 

随机推荐