C++继承细节 -2
- 继承与动态内存分配
//基类定义
class BaseClass {
   private:
		char *label;
   public:
		BaseClass() {}
        BaseClass(const char *l);
        virtual ~BaseClass();
        BaseClass(const BaseClass &bc);
        BaseClass &operator=(const BaseClass &bc);
};
BaseClass::BaseClass(const BaseClass &bc)
{
	this->label = new char[std::strlen(bc.label)+1];
    std::strcpy(this->label, bc.label);
}
BaseClass &BaseClass::operator=(const BaseClass &bc)
{
	this->label = new char[std::strlen(bc.label)+1];
    std::strcpy(this->label, bc.label);
}
BaseClass::~BaseClass()
{
	delete[] this->label;
}
1. 派生类中的数据成员没用`new`分配内存,则不需要为派生类提供 *复制构造函数*、*赋值运算符*;因为在使用已知对象对另一个对象初始化时派生类的默认复制函数将调用基类的显示复制函数(BaseClass(const BaseClass &bc))进行深拷贝,同理赋值运算符也一样。
//派生类定义
class DerivedClass : public BaseClass {
private:
    	char style[20]; //使用栈空间
public:
    	DerivedClass() {}
        DerivedClass(const char *st);
};
2. 派生类中的数据成员使用`new`分配内存,则派生类需要提供 *复制构造函数*、 *赋值运算符*,具体实现如下:
//派生类
class DerivedClass : public BaseClass {
private:
		char *style;
public:
		DerivedClass() {}
    	DerivedClass(const char *st);
    	~DerivedClass() {delete[] this->style;}
    	DerivedClass(const DerivedClass &dc);
    	DerivedClass &operator=(const DerivedClas &dc);
};
//显示复制构造函数
DerivedClass::DerivedClass(const DerivedClass &dc) : BaseClass(dc)
{
	this->style = new char[std::strlen(dc.style)+1];
    std::strcpy(this->style, dc.style);
}
//赋值运算符
DerivedClass & DerivedClass::operator=(const DerivedClass &dc)
{
	if (this == &dc) {
    	return *this;
    }
    delete[] this->style;
    //注意,注意,注意
    BaseClass::operator=(dc); //显示调用基类赋值运算符函数
    this->style = new char[std::strlen(dc.style)+1];
    std::strcpy(this->style, dc.style);
    return *this;
}
C++继承细节 -2的更多相关文章
- python继承细节
		不要子类化内置类型 内置类型(由C语言编写)不会调用用户定义的类覆盖的特殊方法. 例如,子类化dict作为测验: class DoppeDict(dict): def __setitem__(self ... 
- C# 继承细节
		假定没有为类定义任何显式的构造函数,这样编译器就会为所有的类提供默认的构造函数,在后台会进行许多操作,编译器可以很好地解决层次结构中的所有问题,每个类中的每个字段都会初始化为默认值.但在添加了一个我们 ... 
- C++继承细节 -1
		为什么基类析构函数最好要使用 virtual 进行修饰? class A { private: ...... public: ~A(); A() {} }; class B : public A { ... 
- JAVA_SE基础——39.继承
		在面向对象程序设计中,可以从已有的类派生出新类. 这称做继承(inheritance). 白话解释: 例子1:继承一般是指晚辈从父辈那里继承财产,也可以说是子女拥有父母给予他们的东西. 例子2:猫和狗 ... 
- JavaScript类继承
		和其他功能一样,ECMAScript 实现继承的方式不止一种.这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的.这意味着所有的继承细节并非完全由解释程序处理.作为开发者 ... 
- JavaScript中继承机制的模仿实现
		首先,我们用一个经典例子来简单阐述一下ECMAScript中的继承机制. 在几何学上,实质上几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形. ... 
- ECMAScript 继承机制实现
		继承机制的实现 要用 ECMAScript 实现继承机制,您可以从要继承的基类入手.所有开发者定义的类都可作为基类.出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码 ... 
- 一文看懂JS继承
		继承是OOP中大家最喜欢谈论的内容之一,一般来说,继承都两种方式:接口继承和实现继承而JavaScript中没有接口继承需要的方法,因此只能依靠实现继承.在讲继承的实现之前,我们首先来回顾一下什么是继 ... 
- JS如何实现继承?
		JS的继承是基于JS类的基础上的一种代码复用机制.换言之,有了代码,我们就不需要复制之前写好的方法,只要通过简捷的方式 复用之前自己写的或同事写的代码.比如一个弹出层,我们需要在上面做一些修改.同事写 ... 
随机推荐
- 22_CopyOnWrite容器
			[简述] Copy-On-Write简称COW,是一种程序设计中的优化策略. JDK里的COW容器分为两种:CopyOnWriteArrayList 和 CopyOnWriteArraySet. Co ... 
- 动态注册broadcast的安全考虑
			一.android service通知activity更新方式有1. service 通过广播的形式发送broadcast,向这个activity的内部类发广播的消息来更新界面2. service直接 ... 
- js 生成md5
			原理比较复杂,不过人类区别与其他动物是因为会用工具,所以,把下面代码复制保存一下就好了. <script> var hex_chr = "0123456789abcdef&quo ... 
- web images
			ps切图时,我们保存时会要求选择文件格式. 一般来说,如果图像的色彩丰富,没有透明度的要求,则选择为jpeg格式: 如果图像色彩不丰富,我们就选择为png-8的格式,注意:ps中要选择无杂边,无仿色 ... 
- laravel where筛选会判断类型吗?
			laravel where筛选会判断类型吗? laravel where筛选会判断类型吗? laravel where筛选会判断类型吗? 这个说会判断不对,说不会判断也不对. 当字符串'1'和数值1是 ... 
- CountDownLatch的简单使用
			from https://www.jianshu.com/p/cef6243cdfd9 1.CountDownLatch是什么? CountDownLatch是一个同步工具类,它允许一个或多个线程一直 ... 
- Vue收藏资料
			组件库的全局引用和按需引用:http://www.cnblogs.com/zhuanzhuanfe/p/7516745.html 
- MATLAB入门学习(七)
			开始,线性代数和微积分了,不怕.不怕. 背命令就行了... 线性代数 解线性方程组: Ax=b A是系数矩阵,x未知数,b是列向量 如果有唯一解,直接x=b\A 第二 B=null(A,'r')求Ax ... 
- api的使用机制:继承、实例化、实现(继承)配置、实例(参数化)配置、机制管理模块
			api的使用机制:继承.实例化.实现(继承)配置.实例(参数化)配置.机制管理模块 facade模式.管理模块 
- 2019.1.6 2.8  Spring的AOP事务
			2.8 Spring的AOP事务 xml配置aop事务 先applicationContext.xml 文件 配置事务管管理器 配置通知 织入目标对象 
