【24.1.4笔记】C++ Primer自学 Day5

本文介绍了C++中面向对象设计的关键概念,包括类的继承机制(包括扩展类实现、构造函数和析构函数)、is-a关系的体现、虚拟函数的使用以及泛型设计的讨论,强调了封装和效率之间的权衡。

二、C++概述

4、面向对象的设计

        扩展类的实现:1、必须提供自己的实例;2、必须提供实际的操作函数;3、必须提供自己的构造函数。【基类的构造函数无法被派生类继承,派生类的构造函数提供了向基类构造函数传递参数的接口】

inline IntArrayRC::IntArrayRC( int sz) 
: IntArray( sz ) {} 
inline IntArrayRC::IntArrayRC( const int *iar, int sz ) 
: IntArray( iar, sz ) {}

        在冒号后面是派生类向基类传参的接口。这样传参的构造函数不需要提供显式的析构函数,因为在派生类没有引入需要析构的成员,析构函数可以通过基类的析构函数解决。

        C++支持多继承【继承多个类】和虚拟继承【继承派生类】。

Q1:一般来说 类型/子类型继承关系反映了一种 is-a的关系:具有范围检查功能的 ArrayRC 是一种 Array;一本书 Book 是一种图书外借资源LibraryRentalMaterial;有声书 AudioBook 是一种书 Book;等等。下面哪些反映出这种 is-a 关系?
                (a)成员函数是一种(isA_kindOf)函数
                (b)成员函数是一种类
                (c)构造函数是一种成员函数
                (d)飞机是一种交通工具
                (e)摩托车是一种卡车
                (f)圆形是一种几何图形
                (g)正方形是一种矩形
                (h)汽车是一种飞机
                (i)借阅者是一种图书馆
           (a)(c)(d)(f)(g)
Q2:判断以下操作哪些可能是类型相关的,因此可把它们定义为虚拟函数?哪些可以在所有
类之间共享?对单个基类或派生类来说哪些是惟一的?
                (a) rotate(); (b) print();
                (c) size(); (d) dateBorrowed();
                (e) rewind(); (f) borrower();
                (g) is_late(); (h) is_on_loan();
        都可能是类型相关的,都可以共享,都可以是惟一的???
Q3:对于protected 访问级别的使用已经有了一些争论。有人认为 使用保护访问级别允许派生类直接访问基类的成员,这破坏了封装的概念,因此,所有的基类实现细节都应该是私有的private。另外一些人认为,如果派生类不能直接访问基类的成员,那么派生类的实现将无法有足够的效率供用户使用。如果没有关键字protected,类的设计者将被迫把基类成员设置为 public。你怎样认为?
        我认为两者都有道理,看具体的需求。
Q4:第二个争论是关于将成员函数显式地声明为 virtual的必要性。一些人认为,这意味着如
果类的设计者没有意识到一个函数需要被声明为 virtual,则派生类的设计者就没有办法改写这个关键函数。因此,他们建议把所有成员函数都设置为 virtual 的。另一方面,虚拟函数比非虚拟函数的效率要低一些 因为它们不能被内联,内联发生在编译时刻,而虚拟函数是在运行时刻被处理的。所以它们可能是运行时刻效率低下的原因之一。尤其是小巧而又被频繁调用的与类型无关的函数,比如 Array 数组的 size 函数。你又怎样认为呢?
        我认为显式声明是有必要的,这样可以更加灵活去改派生类的内容,也能够使一些功能单一但是需要调用很多次的函数可以内联。

5、泛型设计

        

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值