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.为什么需要面向对象? 面向对象能够像分析现实生 ...
随机推荐
- linux和MAC下静态库.a文件合并
这两天开发群了讨论了一个文体,如何合并众多的.a文件. 有人给了建议,使用ar 解.a,生成.o.然后合并所有的.o文件. 我在MAC OS下尝试了一下. 正好赶上编译了ffmpeg的IOS armv ...
- 第三步 用Jena自定义完成数据库到RDF的映射
第三步 用Jena自定义完成数据库到RDF的映射 2013年10月17日 8:53:27 这一步用Jena编程,终于能做点有技术含量的事情了.这个工作计划本周内完成,下周一好给老师一个交待. 目标:把 ...
- HTML---Android与js交互实例
Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true Android(Java)与JavaScript(HTML) ...
- spring mvc[转]
Spring 注解学习手札(一) 构建简单Web应用 Spring 注解学习手札(二) 控制层梳理 Spring 注解学习手札(三) 表单页面处理 Spring 注解学习手札(四) 持久层浅析 Spr ...
- OPTIMIZE TABLE
INNODB 不支持 mysql> OPTIMIZE TABLE t; +--------+----------+----------+----------------------------- ...
- mysqlbinlog 用法
操作命令: show binlog events in 'binlog.000016' limit 10; reset master 删除所有的二进制日志 flush logs 产生一个新的binl ...
- c语言,strchr(),查找字符串中第一次字符出现的位置
int main(void) { char string[15]; char *ptr, c = 's'; strcpy(string, "This is a string"); ...
- AWS IAM (Identity and Access Management) 使用笔记
为 AWS 管理控制台登录页面 URL 创建别名 $ aws iam create-account-alias --account-alias <value> 创建用户 $ aws iam ...
- Java并发——同步工具类
CountDownLatch 同步倒数计数器 CountDownLatch是一个同步倒数计数器.CountDownLatch允许一个或多个线程等待其他线程完成操作. CountDownLatch对象 ...
- Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
出现这个问题,说明oracle的驱动包没有成功加载. 1.检查maven pom.xml有没有引入驱动: <dependency> <group ...