• 继承与动态内存分配
//基类定义
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的更多相关文章

  1. python继承细节

    不要子类化内置类型 内置类型(由C语言编写)不会调用用户定义的类覆盖的特殊方法. 例如,子类化dict作为测验: class DoppeDict(dict): def __setitem__(self ...

  2. C# 继承细节

    假定没有为类定义任何显式的构造函数,这样编译器就会为所有的类提供默认的构造函数,在后台会进行许多操作,编译器可以很好地解决层次结构中的所有问题,每个类中的每个字段都会初始化为默认值.但在添加了一个我们 ...

  3. C++继承细节 -1

    为什么基类析构函数最好要使用 virtual 进行修饰? class A { private: ...... public: ~A(); A() {} }; class B : public A { ...

  4. JAVA_SE基础——39.继承

    在面向对象程序设计中,可以从已有的类派生出新类. 这称做继承(inheritance). 白话解释: 例子1:继承一般是指晚辈从父辈那里继承财产,也可以说是子女拥有父母给予他们的东西. 例子2:猫和狗 ...

  5. JavaScript类继承

    和其他功能一样,ECMAScript 实现继承的方式不止一种.这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的.这意味着所有的继承细节并非完全由解释程序处理.作为开发者 ...

  6. JavaScript中继承机制的模仿实现

    首先,我们用一个经典例子来简单阐述一下ECMAScript中的继承机制. 在几何学上,实质上几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形. ...

  7. ECMAScript 继承机制实现

    继承机制的实现 要用 ECMAScript 实现继承机制,您可以从要继承的基类入手.所有开发者定义的类都可作为基类.出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码 ...

  8. 一文看懂JS继承

    继承是OOP中大家最喜欢谈论的内容之一,一般来说,继承都两种方式:接口继承和实现继承而JavaScript中没有接口继承需要的方法,因此只能依靠实现继承.在讲继承的实现之前,我们首先来回顾一下什么是继 ...

  9. JS如何实现继承?

    JS的继承是基于JS类的基础上的一种代码复用机制.换言之,有了代码,我们就不需要复制之前写好的方法,只要通过简捷的方式 复用之前自己写的或同事写的代码.比如一个弹出层,我们需要在上面做一些修改.同事写 ...

随机推荐

  1. yield* 表达式

    yield* 表达式用于委托给另一个generator 或可迭代对象. 委托给其他生成器 function* g1() { yield 2; yield 3; yield 4; } function* ...

  2. jQuery无刷新上传之uploadify

    引自 文章 http://www.cnblogs.com/babycool/archive/2012/08/04/2623137.html 将文章里的代码整合在了一个解决方案里,直接可以下载测试,上代 ...

  3. makefile 通配符了解% $@ $^ $<

    把目录下所有文件都编译的命令. 1 all:$(subst .c,.o,$(wildcard *.c)) 2 3 %.o:%.c 4 gcc -o $@ $< 下面是几个特舒符号的意思: $@: ...

  4. 微软发布Azure Stack第一个技术预览版

    为了提升商业灵敏度和加快创新步伐,各个企业都在迅速地转向云服务.在微软,我们已经见到微软智能云Azure的飞速发展和使用,每月我们都有近十万的新增订阅量.然而,我们也了解到还有很多企业在完全移到公有云 ...

  5. HDFS元数据管理机制

    元数据管理概述 HDFS元数据,按类型分,主要包括以下几个部分: 1.文件.目录自身的属性信息,例如文件名,目录名,修改信息等. 2.文件记录的信息的存储相关的信息,例如存储块信息,分块情况,副本个数 ...

  6. [转] 你应该知道的应用UI动态设计规则

    转自 CocoaChina http://www.cocoachina.com/macdev/uiue/2014/0505/8315.html 你应该知道的应用UI动态设计规则 这篇文章中,我主要阐述 ...

  7. U-Mail邮件群发:邮件营销最全建议

    U-Mail专注于邮件营销平台研发工作多年了,服务企业数千家,拥有上万IP,在国内外基础设施建设上投资巨大,技术团队精湛.客服人员热情,赢 得了业界的好评和用户信任.有一些用户给我们发来邮件或来电咨询 ...

  8. 022configparser模块

    #配置模块 #创建import  configparser config  =  configparser.ConfigParser() #添加config["DEFAULT"]  ...

  9. UI层实现

    领域驱动设计实践 —— UI层实现   目录 1. User Interface 2. Controller 3.  DTO 4.  infrastructure层的公共组件 5. UI层类图 6. ...

  10. NET对象的跨应用程序域

    NET对象的跨应用程序域 转眼就到了元宵节,匆匆忙忙的脚步是我们在为生活奋斗的写照,新的一年,我们应该努力让自己有不一样的生活和追求.生命不息,奋斗不止.在上篇博文中主要介绍了.NET的AppDoma ...