c++primer复习(六)—面向对象编程
1 C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定,两个条件(基类引用或指针、虚函数)缺一不可
虚函数的默认实参将发生静态绑定
2 继承层次的根类一般都需要定义虚析构函数
3 任意非static成员都可以是虚析构函数,static成员函数不能是虚析构函数(应为static成员不是属于某个对象的,而是属于整个类的)
4 protected成员:派生类只能通过派生类对象访问基类的protected成员,派生类对其基类类型对象的protected成员没有特殊的访问权限
private成员:基类的private数据成员在派生类类型的对象中存在,但是派生类没有任何权限访问到基类的private成员
class A
{
private:
int val;
}; class B:A
{
public:
void func(){cout << val;}
};
func将报错,因为val在派生类中是无权访问的
是否可以理解为:基类中的private和protected成员在基类以外都是能通过基类类型对象来访问的,protected成员在派生类中是可见的,private成员在派生类中是不可见的
5 派生类中的虚函数和基类中的虚函数要保持一致,除非返回类型是基类类型的引用,则派生类中的虚函数返回的可以是及类类型或派生类类型的引用
6 基类类型的指针或引用调用虚函数时,可以通过作用域操作符实现覆盖虚函数动态绑定机制,即指定虚函数的版本
7 接口继承:public继承,即继承了基类的接口
实现继承:protected继承和private继承,即从基类继承的部分并没有称为其接口的一部分,仅仅是便于其内部实现而已
在实现继承中,可以通过在派生类的public声明下声明基类的成员,从而实现这些成员的public继承
8 static成员在整个继承层次中只有一个,如果是private类型,在派生类不能访问。static成员既可以使用作用域操作符来调用,又可以使用箭头操作符来调用
9 派生类中,构造函数总是先构造基类部分,再构造派生类部分,即使派生类构造函数初始化列表中没有基类构造函数,也将先调用基类的默认构造函数,构造基类部分
派生类构造函数初始化列表中,只能初始化自己的直接基类(尊重基类接口)
10 派生类析构函数:派生类析构函数不负责撤销基类对象的成员,编译器总是显式调用派生类对象基类部分的析构函数,每个析构函数只负责清理自己的成员
对象的撤销顺序与构造顺序相反,首先执行派生类析构函数,然后按继承层次依次向上调用各基类析构函数
11 虚析构函数:
派生类自动调用基类析构函数撤销基类部分对基类的设计有重要的影响
删除指向动态分配对象的指针时,在释放对象的内存之前,需要运行对象的析构函数。可是指针的静态类型可能与被删除对象的动态类型不同(可能会删除实际指向派生类对象的基类类型的指针),因此基类的析构函数要为虚析构函数,保证析构函数的动态绑定
12 纯虚函数:
在虚函数形参表后面添上=0可以将虚函数定义为纯虚函数,含有(或继承)一个或多个纯虚函数的类称为抽象基类,抽象类不能创建对象
如果一个类没有将从基类继承来的虚函数声明为纯虚函数,同时类没有实现自己的虚函数版本,则指向该类的指针动态调用虚函数时将使用继承类的虚函数版本,这可能不满足该类的用户调用该函数时的期望,所以将该函数声明为纯虚函数,这样将不能创建该类的对象
13 句柄类
C++面向对象编程,却不能使用对象本身来支持面向对象编程,而必须使用指针或引用
通用的技术是定义句柄类,句柄类存储和管理基类的指针,句柄的用户可以获得动态行为。
c++primer复习(六)—面向对象编程的更多相关文章
- 《C++ Primer》之面向对象编程(四)
纯虚函数 在前面所提到过的 Disc_item 类提出了一个有趣的问题:该类从 Item_base 继承了 net_price 函数但没有重定义该函数.因为对 Disc_item 类而言没有可以给予该 ...
- 《C++ Primer》之面向对象编程(一)
面向对象编程基于三个基本概念:数据抽象.继承和动态绑定.//动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 面向对象编程的关键思想是多态性(polymorphism). ...
- C++复习9.面向对象编程
C++ 面向对象编程概述 20131001 一些基本概念:封装.继承.组合.虚函数.抽象基类.动态绑定.多态性等等 1.一个笑话:如果坐在后排聊天的同学能够像中间打牌的同学那样安静的话,那么就不会影响 ...
- 《C++ Primer》之面向对象编程(二)
构造函数和复制控制 每个派生类对象由派生类中定义的(非 static)成员加上一个或多个基类子对象构成,当我们构造.复制.赋值和撤销一个派生类对象时,也会构造.复制.赋值和撤销这些基类子对象. 构造函 ...
- 《C++ Primer》之面向对象编程(三)
继承情况下的类作用域 在继承情况下,派生类的作用域嵌套在基类作用域中.如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义.正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就 ...
- C++ Primer 有感(面向对象编程)
1.除了构造函数之外,任意非static成员函数都可以是虚函数.保留字virtual只在类内部的成员函数声明处出现,不能用在类定义体外部出现的函数定义上. 2.派生类只能通过派生类对象访问其基类的pr ...
- Python学习札记(三十六) 面向对象编程 Object Oriented Program 7 __slots__
参考:slots NOTE 1.动态语言灵活绑定属性及方法. #!/usr/bin/env python3 class MyClass(object): def __init__(self): pas ...
- [.net 面向对象编程基础] (1) 开篇
[.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...
- Java面向对象编程基础
一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...
随机推荐
- HW2.7
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- [Locked] Range Sum Query 2D - Mutable
Range Sum Query 2D - Mutable Given a 2D matrix matrix, find the sum of the elements inside the recta ...
- Redis+Spring缓存实例(windows环境,附实例源码及详解)
原文出处: 小宝鸽 一.Redis了解 1.1.Redis介绍: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串). ...
- csdn 刷分小工具(刷了1000多被封了,慎用)
先上图,周第一, 月第六代码未整理,比较乱,仅仅供参考(cookie已经废了,号被封了,哈哈) using System; using System.Collections.Generic; usin ...
- MVC模式网站编写经验总结
单个网站使用MVC架构模式经验总结,包含具体网站包分类.包内类的编写.注意事项等方面.本人认为,按照如下包分类及编写方法,已经满足一个简单普通网站(主要针对java)的编写需求. MVC主要层级 数据 ...
- -bash: ls: command not found
在iMac下ls既然command not found,查找了下 原因:在设置环境变量时,编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别.解决方案: 直接在控制台下 expo ...
- \\ip 映射 指定的网络名不再可用
问题:\\ip 映射 指定的网络名不再可用 解决方法:服务器端打开服务列表 services.msc 启动两个进程 1.Computer Browser 2. Workstation 就正常了~~ ...
- patchdiff2 函数比较插件
https://code.google.com/archive/p/patchdiff2/downloads
- 适用于cocos2dx的编辑器:Texture,Tilemap,Particle,Action,Level etc
原文:http://www.cocos2d-x.org/wiki/Editors_for_cocos2d-x_TextureTilemapParticleActionLevel_etc Action ...
- 使用HttpURLConnection实现在android客户端和服务器之间传递对象
一般情况下,客户端和服务端的数据交互都是使用json和XML,相比于XML,json更加轻量级,并且省流量,但是,无论我们用json还是用xml,都需要我们先将数据封装成json字符串或者是一个xml ...