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(深度卷积网络 ...
随机推荐
- linux查找文件利器
查找文件 比如:找nginx.conf配置文件 locate nginx.conf /usr/local/etc/nginx/nginx.conf /usr/local/etc/nginx/nginx ...
- [LeetCode] 21. Merge Two Sorted Lists 合并有序链表
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- PCL读取PCD文件的数据
1.pcd文件——rabbit.pcd 链接:https://pan.baidu.com/s/1v6mjPjwd7fIqUSjlIGTIGQ提取码:zspx 新建项目pcl rabbit.pcd 和p ...
- Spring中的AOP实现思路
AOP是面向切面编程,为什么在切面中写一个注解方法@Before,这个方法会在目标方法前面执行呢 基于JDK动态代理实现上面说的情况 自定义注解 @Target({ ElementType.METHO ...
- 在Python中创建和使用类
编程只是 if : 为了少写重复的代码,有了循环 for/while: 但碰到很长的重复代码,可能用一个循环难以实现,所以出现了面向对象的思想: 类:就是你的循环主体 实例:就是对你的循环的一次调用 ...
- jwt 0.9.0(二)jwt官网资料总结
1.JWT描述 Jwt token由Header.Payload.Signature三部分组成,这三部分之间以小数点”.”连接,JWT token长这样: eyJhbGciOiJIUzI1NiIsIn ...
- Ubuntu /etc/security/limits.conf 不生效问题
一.问题描述 修改 /etc/security/limits.conf ,重启之后不生效 内容如下: * soft nofile * hard nofile root soft nofile root ...
- Rediskey生命周期管理-key聚合
| 导语 Redis中的数据以k-v的方式组织:为了方便管理key一般具有某些特定的模式:有些key直接是由mysql中的表行数据转化而来:如果要对Redis的key进行生命周期管理,由于Redis的 ...
- 结合consul raft库理解raft
一 入口 github.com/hashicorp/consul/agent/consul/server.go func (s *Server) setupRaft() error { 状态机,用于c ...
- new Image 读取宽高为0——onload
获取图片一张图片的大小 let img = new Image() img.src = imgUrl if ( img.width != 375 || img.height != 200 ) { me ...