派生类继承了基类的所有成员,但不包含 构造函数、析构函数、默认赋值运算符。

 1、继承方式、访问控制

(1)protected属性:类的对象不能访问该属性成员,但派生类的成员函数可以访问基类的protected属性成员。

(2)无论哪种继承方式,派生类成员函数都可访问:public、protected ,但不能是基类的 private;

(3)什么属性的继承,在派生类中就是什么属性。

C++中的继承方式会影响子类的对外访问属性,判断原则如下

(a)看调用语句,写在子类的内部还是外部;

(b)看子类如何从父类继承;

(c)看父类中的访问级别;

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include<cstring>
using namespace std; class Document
{
public:
Document();
Document(char* name);
~Document()
{
}
void PrintName();
private:
char *Name;
};
Document::Document(char *name)
{
Name = new char[strlen(name) + ];
strcpy(Name, name);
}
void Document::PrintName()
{
cout << Name << endl;
} class Book : public Document
{
public:
Book(char name[], int pagecout);
void PrintName();
private:
int PageCount;
};
Book::Book(char *name, int pagecount) :Document(name)
{
PageCount = pagecount;
}
void Book::PrintName()
{
cout << "name of book: ";
Document::PrintName();
} int main()
{
Document a("Document1");
a.PrintName();
Book b("Book1", );
b.PrintName();
system("pause");
return ;
}

2、派生类的构造和析构

(1)基类的构造和析构函数不能被派生类所继承,派生类需要定义自己的。基类具有无参构造函数,派生类未定义自己的,则系统自动调用基类的无参构造来初始化派生类。若基类没有无参的,派生类也不自己定义,则编译会出错。

(2)派生类的析构函数:不能继承基类的,只可以自己定义,且只负责清理它新定义的成员,清理位于堆区的成员。

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include<string>
using namespace std; class Cpolygon
{
private:
double side1, side2;
public:
Cpolygon(double, double);
double value_1()
{
return side1;
}
double value_2()
{
return side2;
}
void get_values()
{
cout << "side1= " << side1 << "side2= " << side2 << endl;
}
};
Cpolygon::Cpolygon(double a, double b)
{
side1 = a; side2 = b;
} class Crectangle :public Cpolygon
{
public:
Crectangle(double, double);
double area()
{
return (value_1()*value_2());
}
void get_values()
{
cout << "长方形的边长: ";
Cpolygon::get_values();
cout << "面积:" << area() << endl;
}
};
// 派生类的构造函数
Crectangle::Crectangle(double a, double b):Cpolygon(a,b){} int main()
{
Crectangle rec(, );
rec.get_values();
system("pause");
return ;
}

3、虚继承

派生类中的 static 关键字:类内定义,类外初始化,在初始化的时候分配内存。

1、多继承与二义性

多继承:派生类有多个直接基类或间接基类;

二义性:派生类的多继承引起二义性,基类构造函数调用了两次,也析构了两次;

 2、虚继承

解决方法:将共有基类设置为虚基类

// 虚基类
class Fderiver1 :virtual public base
{ };

C++(三十八) — 继承方式、访问控制、构造和析构、虚继承的更多相关文章

  1. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  2. NeHe OpenGL教程 第三十八课:资源文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

    1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...

  4. Java进阶(三十八)快速排序

    Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...

  5. 微信小程序把玩(三十八)获取设备信息 API

    原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...

  6. C++ 类的继承三(继承中的构造与析构)

    //继承中的构造与析构 #include<iostream> using namespace std; /* 继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父 ...

  7. bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  8. C++ 继承方式 //语法:class 子类 :继承方式 父类 //继承方式 三种: //1.公共继承 //2.保护继承 //3.私有继承

    1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 #include <ios ...

  9. Deep learning:三十八(Stacked CNN简单介绍)

    http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...

随机推荐

  1. iOS开发应该知道的7个编程概念

    对流行工具(如Xcode)和编程概念(如视图控制器)的高级讨论,这些对iOS开发本身很有用. 1. Xcode Xcode是iOS应用开发社区所见过的最通用的IDE.由于集成开发环境来自Apple,它 ...

  2. [LeetCode] 377. Combination Sum IV 组合之和 IV

    Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...

  3. harbor的安装和简单使用【h】

    安装docker的私有仓库, 利用vmware提供的harbor工具, 参考Docker 私有仓库方案比较与搭建, Harbor安装 -- 企业级Registry仓库 2.2harborProject ...

  4. tablespace表空间

    tablespace——表空间,便于理解,把oracle数据库看作一个实在房间,表空间可以看作这个房间的空间,是可以自由分配,在这空间里面可以堆放多个箱子(箱子可以看作数据库文件),箱子里面再装物件( ...

  5. Navicat 8 For Mysql 数据库的导出与加载

    方便断断续续的数据库实验课,避免每次都要重新写入数据,可使用Navicat的数据库导出功能 数据库的导出 1.选择要导出的数据库,右键点击“转存SQL文件”选项. 2.填写文件名字,选择位置,点击“保 ...

  6. Mahalanobia Distance(马氏距离)的解释

    马氏距离有多重定义: 1)可以表示 某一个样本与DataSet的距离. 2)可以表示两个DataSet之间的距离. 1) The Mahalanobis distance of an observat ...

  7. C++ 读取 MATLAB 的 .m 文件,并发送到 MATLAB 运行

    本代码是由「Microsoft Visual Studio 2015 Enterprise」编写. 想要了解更多 C++ 与 MATLAB 混合编程的知识,可以参考我的另一篇博客:C++ 与 MATL ...

  8. typedefine 用法

    typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 用法: 变量别名 例如: 单个变量: t ...

  9. array_merge_recursive 的使用

    作用:递归合并数组 场景:在平时开发中,我们可能遇到获取的数据是多个维度的数据,而我们只需要其中的一个. 代码如下: $project_id = 'project_id'; $arr1 = [ 'pr ...

  10. mysq 连表更新

    update table1 a left join table2 b on a.id = b.user_id left join table3 c on a.id = c.user_idset a.p ...