C++(三十八) — 继承方式、访问控制、构造和析构、虚继承
派生类继承了基类的所有成员,但不包含 构造函数、析构函数、默认赋值运算符。
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++(三十八) — 继承方式、访问控制、构造和析构、虚继承的更多相关文章
- SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)
0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...
- NeHe OpenGL教程 第三十八课:资源文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...
- Java进阶(三十八)快速排序
Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...
- 微信小程序把玩(三十八)获取设备信息 API
原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...
- C++ 类的继承三(继承中的构造与析构)
//继承中的构造与析构 #include<iostream> using namespace std; /* 继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父 ...
- bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- C++ 继承方式 //语法:class 子类 :继承方式 父类 //继承方式 三种: //1.公共继承 //2.保护继承 //3.私有继承
1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 #include <ios ...
- Deep learning:三十八(Stacked CNN简单介绍)
http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...
随机推荐
- iOS开发应该知道的7个编程概念
对流行工具(如Xcode)和编程概念(如视图控制器)的高级讨论,这些对iOS开发本身很有用. 1. Xcode Xcode是iOS应用开发社区所见过的最通用的IDE.由于集成开发环境来自Apple,它 ...
- [LeetCode] 377. Combination Sum IV 组合之和 IV
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- harbor的安装和简单使用【h】
安装docker的私有仓库, 利用vmware提供的harbor工具, 参考Docker 私有仓库方案比较与搭建, Harbor安装 -- 企业级Registry仓库 2.2harborProject ...
- tablespace表空间
tablespace——表空间,便于理解,把oracle数据库看作一个实在房间,表空间可以看作这个房间的空间,是可以自由分配,在这空间里面可以堆放多个箱子(箱子可以看作数据库文件),箱子里面再装物件( ...
- Navicat 8 For Mysql 数据库的导出与加载
方便断断续续的数据库实验课,避免每次都要重新写入数据,可使用Navicat的数据库导出功能 数据库的导出 1.选择要导出的数据库,右键点击“转存SQL文件”选项. 2.填写文件名字,选择位置,点击“保 ...
- Mahalanobia Distance(马氏距离)的解释
马氏距离有多重定义: 1)可以表示 某一个样本与DataSet的距离. 2)可以表示两个DataSet之间的距离. 1) The Mahalanobis distance of an observat ...
- C++ 读取 MATLAB 的 .m 文件,并发送到 MATLAB 运行
本代码是由「Microsoft Visual Studio 2015 Enterprise」编写. 想要了解更多 C++ 与 MATLAB 混合编程的知识,可以参考我的另一篇博客:C++ 与 MATL ...
- typedefine 用法
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 用法: 变量别名 例如: 单个变量: t ...
- array_merge_recursive 的使用
作用:递归合并数组 场景:在平时开发中,我们可能遇到获取的数据是多个维度的数据,而我们只需要其中的一个. 代码如下: $project_id = 'project_id'; $arr1 = [ 'pr ...
- 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 ...