继承与动态内存分配——《c++primer plus第五版》

news/2024/7/4 13:42:28
2008-04-09 00:25

继承与动态内存分配——《c++primer plus第五版》

http://hi.baidu.com/wangxiaoliblog/item/e334fcba483c95d684dd7992

继承是怎样与动态内存分配进行互动的呢?例如,如果基类使用动态内存分配,并重新定义赋值和复制构造函数,这将怎样影响派生类的实现呢?这个问题的答案取决于派生类的属性。如果派生类也使用动态内存分配,那么就需要学习几个新的小技巧。下面来看看这两种情况:


一.派生类不使用new


派生类是否需要为显示定义析构函数,复制构造函数和赋值操作符呢?
不需要!


首先,来看是否需要析构函数,如果没有定义析构函数,编译器将定义一个不执行任何操作的默认构造函数。实际上,派生类的默认构造函数总是要执行一些操作:执行自身的代码后调用基类析构函数。因为我们假设派生类的成员不需要执行任何特殊操作,所以默认析构函数是合适的。


再看复制构造函数。默认复制构造函数执行成员复制,这对于动态内存分配来说是不合适的,但对于新的派生类的成员来说是合适的。因此只需要考虑继承的基类的对象。要知道,成员复制将根据数据类型采用相应的复制方式,因此复制类成员或继承的类组件时,则是使用该类的复制构造函数完成的。所以派生类的默认复制构造函数使用基类的显示复制构造函数来复制派生类对象的基类成员部分。因此,默认复制构造函数对于新的派生类而言是合适的。


对于赋值来说,同样道理。


二.派生类使用new。


如果派生类需要new操作,那么需要显示定义析构函数,复制构造函数和赋值操作符。


派生类析构函数自动调用基类的构造函数,故其自身的职责是对派生类构造函数执行工作的进行清理。


接下来看复制构造函数:
DerivedClass::DerivedClass(const DerivedClass& de):BaseClass(de)
{
//.......
}


看赋值操作符:
DerivedClass::operator=(const DerivedClass& de)
{
if(this == &de) return *this;
BaseClass::operator=(de);
//..........
}


总之,当基类和派生类都采用动态内存分配时,派生类的析构函数,复制构造函数以及赋值操作符都必须使用想用的基类方法来处理基类元素。这种要求是通过三种不同的方式来满足的。

1.对于析构函数,这是自动完成的;

2.对于构造函数,这是通过在初始化成员列表中调用基类的复制构造函数来完成的;如果不是这样做,将自动调用基类的默认构造函数。

3.对于复制操作符,这是通过使用作用域解析操作符显示的调用基类的赋值操作符来完成了。


http://www.niftyadmin.cn/n/4645241.html

相关文章

今天去交行还款花了两个小时

昨天运气不好,晚上跑去交通银行还信用卡账单,发现能存款的机器全部宕机,无奈之下今天早上去了,昨晚玩了一个通宵的游戏,早上起来后感觉有点疲惫,加上房东阿姨是一个难缠的主,相当的耗费精力&…

c++ 内存分布(一)

c 内存分布(一)2011-08-31 10:58http://hi.baidu.com/kuhntoria/blog/item/d92ec865a54242c48cb10d4e.html(1)单继承,无虚函数覆盖,无成员变量,无虚继承...1 (2继承无虚函数覆盖 有成员变量,无虚继承...3 (3)单继承有虚…

c++内存分布(二)--虚函数和虚继承

c内存分布(二)--虚函数和虚继承http://hi.baidu.com/kuhntoria/blog/item/5872c1fe9bfd5d0d6d22eb22.html2011-08-31 16:20一.多重继承 首先我们先来考虑一个很简单(non-virtual)的多重继承。看看下面这个C类层次结构。 1 class Top 2 { 3 pu…

关于内核符号表

关于内核符号表 http://soft-app.iteye.com/blog/920312 在编写驱动的过程中,常会使用到EXPORT_SYMBOL宏来将定义的函数名导出到内核符号表。以前只是简单的知道如果一个模块中定义的函数要提供给其他模块调用,就必须进行导出。这段时间在编译单个模块…

内核符号表详解

内核符号表详解 http://hi.baidu.com/apollon2010/blog/item/ecbe1d5a3bd2ec8a800a18dc.html 关键词: Kernel Symbol Table、/proc/ksyms、system.map、Oops、LKM 这应该是一个很基本的内核概念,和模块、系统调用等一样基础,但牵涉的东…

如何读取被禁用的网卡信息

http://topic.csdn.net/u/20080310/19/5fa9b49d-c7f5-42be-986f-4cb46fb4e0b0.html?2079547956 比如,有两张网卡,一张启用,一张禁用,如何获取被禁用的网卡的信息,如网卡MAC,网卡名称等。GetAdaptersInfo…

如何在IDA中找到MFC程序的消息处理函数

比起用Win32SDK写的程序,要分析MFC应用程序要麻烦不少。在前者,只要找到注册窗口类的地方就知道其WinProc的位置。那里是程序的控制中心,只要顺藤摸瓜就可以找到你感兴趣的地方。对于用MFC写的程序,这一切都变得复杂起来了。这时&…

距离矢量路由协议通用属性

一、路由分类大多的路由协议都属于两个类别1、距离矢量(Distance Ventor)、2、链路状态(Link State)二、距离矢量路由协议因为路由是以矢量(距离,方向)的方式被通告出去的,其中距离是…