PoEduo - C++阶段班【Po学校】-继承&虚函数&抽象&接口- 课堂笔记

附录(一) 扩展知识:



 1--> 面向对象的三个基本特征   

1.0   封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public)

1.1   继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。

1.3   多态:是将父对象设置成为和一个或更多的与他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 

 2--> 多态的作用?
主要是两个:

2.0   隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;

2.1   接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

 3-->是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?
3.0  virtual修饰符会被隐形继承的。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。

3.1  同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual ,也能实现多态。

3.2  在子类的空间里,有父类的私有变量。私有变量不能直接访问。

 4-->析构函数和虚函数的用法和作用?
4.0  析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。 有释放内存空间的作用。

4.1  虚函数是C++多态的一种表现, 使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。

 5-->基类的析构函数不是虚函数,会带来什么问题?
5.0  派生类的析构函数用不上,会造成资源的泄漏。

 6-->多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?

6.0  虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.

6.1  而对象的隐藏成员--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键。

 7-->在C++中有没有纯虚构造函数?
7.0  构造函数不能是虚的。只能有虚的析构函数。

 8-->巩固练习

8.0  如果ClassA中定义并实现虚函数int func(void),ClassB中也实现该函数,那么上述变量a->func()将调用哪个类里面的函数?如果int func(void)不是虚函数,情况又如何?为什么?
回答:  【参考答案】第一问调用的是B的。第二问调用A的。虚函数的一个典型应用,虚函数只能借助于指针或者引用来达到多态的效果。

8.1  看以下代码,回答:  【标准答案】A

class A 
{   virtual void func1();
    void func2();
};

class B: class A 
{   
    void func1()
    {
        cout < < "fun1 in class B" < < endl;
    }
   virtual void func2()
    {
        cout < < "fun2 in class B" < < endl;
    } 
};     

    A,   A中的func1和B中的func2都是虚函数

    B,   A中的func1和B中的func2都不是虚函数.

    C,   A中的func2是虚函数.,B中的func1不是虚函数.

    D,   A中的func2不是虚函数,B中的func1是虚函数.

回答:  【标准答案】A

附录(二)   扩展加强:



1. 简述多态的原理,和vptr指针。
当类中声明虚函数时,编译器会在类中生成一个虚函数表.虚函数表是一个存储类成员函数指针的数据结构,virtual成员函数会被编译器放入虚函数表中,存在虚函数时,每个对象中都有一个指向虚函数表的指针vptr指针

2. 如何证明virtual 虚函数中 vptr指针的存在。
定义虚函数,用sizeof求类的大小

3. 可不可以用父类指针进行++操作来遍历子类对象数组?
父亲指针和子类指针的步长一样就可以

4. 简述什么是纯虚函数,意义何在?
纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本

5. 什么是抽象类? 抽象类是否能够实例化。
一个具有纯虚函数的基类称为抽象类
不可以实例化

6. 何为面向抽象层编程?意义何在?

7. 将电脑组装案例 拆分成多文件形式。

8. 编写一个C++程序, 计算程序员( programmer )工资
1 要求能计算出初级程序员( junior_programmer ) 中级程序员 (
mid_programmer )高级程序员( adv_programmer)的工资
2 要求利用抽象类统一界面,方便程序的扩展, 比如:新增, 计算 架构师
(architect ) 的工资

9. 设计一个基类Shape包含成员函数Show(), 将Show()声明为纯虚函数。
Shape类公有派生矩形类Square(正方形)和圆类Circle(圆形),
问题1: 分别定义Show()实现其主要集合元素的显示。使用抽象类Shape
类型的指针,当它指向某个派生类的对象时,就可以通过访问该对象的虚函数
成员Show()。
问题2:用ShowArea()分别显示各种图形的面积.最后还要显示所有图形
的各个面积。要求积累指针数组,数组的每个元素指向一个派生类对象。

时间: 2024-10-12 20:33:56

PoEduo - C++阶段班【Po学校】-继承&虚函数&抽象&接口- 课堂笔记的相关文章

【足迹C++primer】52、转换和继承,虚函数

转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding how object-oriented programming works in C++. 理解基类和派生类之间的转换是必不可少的 理解面向对象编程在. Like built-in pointers, the smart pointer classes (§12.1, p. 450) support

【足迹C++primer】52、,转换和继承虚函数

转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding how object-oriented programming works in C++. 理解基类和派生类之间的转换是不可缺少的 理解面向对象编程在. Like built-in pointers, the smart pointer classes (§12.1, p. 450) support

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

虚函数/纯虚函数/抽象类/接口/虚基类

1.多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 在Java中,没有指针,就直接用父类实例化子类对象 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的,多态可以让父类的指针有“多种形态”,这是一种泛型技术. 所谓泛型技术,就是试图使用不变的代码来实现可变的算法 2.虚函数 在基类的类定义中,定义虚函数的一般形式: Virtual 函数返回值类型 虚函数名(形参表){ 函数

C++虚函数之接口 最简单的功能

虚函数 ,接口,到底有什么用呢? 以前我都是在C++ 里面写C,只用到 简单的C++面对对象知识 #include<stdio.h> class IServerLogic{ virtual ~IServerLogic(){} public: virtual bool OnStart()=0; virtual bool OnStop()=0; }; class ServerLogic:public IServerLogic{ public: virtual bool OnStart(){prin

关于C++与Java中虚函数问题的读书笔记

之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的代码,输入结果竟是Base,这让一直以来用C/C++的我有些莫不着头脑,不是Java里对象是引用吗?C/C++中通过指向基类的指针或引用来指向派生类,那么对于虚函数来说通过基类指针使用的是指向的派生类.但在Java中没有keyword标明虚函数,此时就不是非常明确究竟调用的谁. class base

OOP2(虚函数/抽象基类/访问控制与继承)

通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当某个虚函数通过指针或引用调用时,编译器产生的代码直到运行时才能确定应该调用哪个版本的函数.被调用的函数是与之绑定到指针或引用上的对象的动态类型相匹配的那一个 注意:动态绑定只有当我们通过指针或引用调用虚函数时才会发生.当我们通过一个具有普通类型(非引用非指针)的表达式调用虚函数时,在编译时就会将调用

一道关于C++ 继承/虚函数 笔试题 [转]

转自:http://www.cnblogs.com/yangyh/archive/2011/06/04/2072393.html 首先这位作者, 因为看了这篇简短的一个博文, 我相同了关于虚函数方面的知识. #include "stdafx.h" #include "stdio.h" #include "string.h" class Father { public: name() {printf("father name\n"

多态性与虚函数——C/C++学习笔记

多态性(polymorphism) 即:向不同对象发送同一个消息,不同的对象在接收时候会产生不同行为. 所谓消息,就是函数调用. C++中多态性就是:具有不同功能的函数可以有相同的函数名称.即实现用同一个函数名调用不同的函数内容. C++多态性分为:静态多态性 和 动态多态性 静态多态性:通过函数重载或者运算符重载实现,在编译阶段即知道函数的全部调用关系,也称为是编译时的多态性.根据表达式上下文确定该执行哪一个功能. 优点:调用速度快,效率高:缺点:缺乏灵活性. 动态多态性:在运行时实现的多态,