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(深度卷积网络 ...
随机推荐
- [LeetCode] 144. Binary Tree Preorder Traversal 二叉树的先序遍历
Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...
- [LeetCode] 231. Power of Two 2的次方数
Given an integer, write a function to determine if it is a power of two. Example 1: Input: 1 Output: ...
- sqlyog 社区版
https://github.com/webyog/sqlyog-community/wiki/Downloads
- phpexcel无法导出的解决方法
phpexcel无法导出的解决方法 <pre> set_time_limit(0); ini_set("memory_limit","512M"); ...
- ByteBuffer常见方法
ByteBuffer的三个属性 limit:所有对Buffer读写操作都会以limit变量的值作为上限. position:代表对缓冲区进行读写时,当前游标的位置. capacity:代表缓冲区的最大 ...
- 在 Visual Studio 中部署 ASP.NET Core 应用
另一篇:在 Docker 中手工部署 ASP.NET Core 应用 操作步骤 1. 安装 Docker For Windows(安装之前 Windows 需要 开启 Hyper-V 虚拟机功能 ) ...
- sync包 — 汇总
sync包 package main; import ( "time" "fmt" ) func main() { //time.Time代表一个纳秒精度的时间 ...
- hive学习(1)
什么是Hive Hive是基于Hadoop的一个数据仓库工具(E抽取T转换L加载),可以将结构化的数据文件映射为一张表,并提供类SQL查询功能. 本质是:将HQL转化成MapReduce程序 Hive ...
- Python之 time 模块
时间模块的转换关系与方式: #!/usr/bin/env python # -*- coding:utf8 -*- import time # 时间戳 print('\ntime.time() --& ...
- AVR单片机教程——数字输入
我们已经学习了如何使用按键和拨动开关,不知你有没有好奇 button_down 和 switch_status 等函数是如何实现的.本篇教程带你一探究竟,让我们从按键的原理开始. 在原理图中,按键的符 ...