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复习(六)—面向对象编程的更多相关文章

  1. 《C++ Primer》之面向对象编程(四)

    纯虚函数 在前面所提到过的 Disc_item 类提出了一个有趣的问题:该类从 Item_base 继承了 net_price 函数但没有重定义该函数.因为对 Disc_item 类而言没有可以给予该 ...

  2. 《C++ Primer》之面向对象编程(一)

    面向对象编程基于三个基本概念:数据抽象.继承和动态绑定.//动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 面向对象编程的关键思想是多态性(polymorphism). ...

  3. C++复习9.面向对象编程

    C++ 面向对象编程概述 20131001 一些基本概念:封装.继承.组合.虚函数.抽象基类.动态绑定.多态性等等 1.一个笑话:如果坐在后排聊天的同学能够像中间打牌的同学那样安静的话,那么就不会影响 ...

  4. 《C++ Primer》之面向对象编程(二)

    构造函数和复制控制 每个派生类对象由派生类中定义的(非 static)成员加上一个或多个基类子对象构成,当我们构造.复制.赋值和撤销一个派生类对象时,也会构造.复制.赋值和撤销这些基类子对象. 构造函 ...

  5. 《C++ Primer》之面向对象编程(三)

    继承情况下的类作用域 在继承情况下,派生类的作用域嵌套在基类作用域中.如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义.正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就 ...

  6. C++ Primer 有感(面向对象编程)

    1.除了构造函数之外,任意非static成员函数都可以是虚函数.保留字virtual只在类内部的成员函数声明处出现,不能用在类定义体外部出现的函数定义上. 2.派生类只能通过派生类对象访问其基类的pr ...

  7. Python学习札记(三十六) 面向对象编程 Object Oriented Program 7 __slots__

    参考:slots NOTE 1.动态语言灵活绑定属性及方法. #!/usr/bin/env python3 class MyClass(object): def __init__(self): pas ...

  8. [.net 面向对象编程基础] (1) 开篇

    [.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...

  9. Java面向对象编程基础

    一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...

随机推荐

  1. HW4.9

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  2. POJ1365 - Prime Land(质因数分解)

    题目大意 给定一个数的质因子表达式,要求你计算机它的值,并减一,再对这个值进行质因数分解,输出表达式 题解 预处理一下,线性筛法筛下素数,然后求出值来之后再用筛选出的素数去分解....其实主要就是字符 ...

  3. PC-删除共享[绝对够狠的方法]

    1.批处理清除法-------------------------------------------------------------------------------------------- ...

  4. A Tour of Go Struct Literals

    A struct literal denotes a newly allocated struct value by listing the values of its fields. You can ...

  5. javascript闭包详解

    以前写过一篇关于javascript闭包的随笔,javascript闭包,但是写的不够详细,也没有体现出闭包的强大之处.故作此篇. 众所周知,javascript没有块级作用域,只有函数作用域.那就意 ...

  6. mongodb基础系列——数据库查询数据返回前台JSP(一)

    经过一段时间停顿,终于提笔来重新整理mongodb基础系列博客了. 同时也很抱歉,由于各种原因,没有及时整理出,今天做了一个demo,来演示,mongodb数据库查询的数据在JSP显示问题. 做了一个 ...

  7. 恼人的Visual Studio 2010崩溃重启问题

    上周时Visual Studio 2010突然出现崩溃现象.在源文件修改只要一编译,马上就崩溃,而且还不弹出任何异常窗口,严重影响软件开发工作. google了无数解决方案 试了下面这些方法: 1)h ...

  8. Eclipse选择rt.jar的源代码的位置

    1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES" 2. ...

  9. PowerShell优化和性能测试

    measure-command -expression {$null = "abc"}  效率高于 {"abc" |out-null } foreach {$p ...

  10. android 读取用户号码,手机串号,SIM卡序列号

    简介: IMSI:international mobiles subscriber identity国际移动用户号码标识,这个一般大家是不知道,GSM必须写在卡内相关文件中:MSISDN:mobile ...