摘要: 啊啊 阅读全文
posted @ 2017-03-23 11:30 郑哲 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 1.面向对象的编程中,我们希望尽可能减少类之间的依赖行。这样能让类更加强健,更加容易维护。 但继承却与次背道而驰。 每个派生类十分依赖它的基类(或多个类),如果基类的接口发生改动,所以派生类都不得不为了适应基类的接口而改动。 (这是我们为什么总力争设计出几乎无需修改的基类) 2.动态绑定的开销。非虚 阅读全文
posted @ 2017-03-23 11:22 郑哲 阅读(93) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2017-03-23 11:07 郑哲 阅读(71) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2017-03-23 10:57 郑哲 阅读(84) 评论(0) 推荐(0) 编辑
摘要: 1.抽象基类提供了统一的借口,用于处理各种不同的派生类。 2.抽象类将实现的责任交给了派生类。 其中一个派生类的实现: 阅读全文
posted @ 2017-03-23 10:50 郑哲 阅读(410) 评论(0) 推荐(0) 编辑
摘要: 例如我们在计算个人资产净值时,汽车,珠宝,不动产,股票,银行存款都是个人资产的不同类型。 所谓净值是资产的当前现金价值。汽车的净值根据它的保养情况,行驶里程,使用年限有关。 而珠宝的净值会随年限增长,也就是说不能用一个函数来实现计算净值 实现ComputeNetWorth()是很难的 我们希望保证T 阅读全文
posted @ 2017-03-23 10:28 郑哲 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 结果输出: Executing B::f(); Object d was created successfully Executing D::f() 原因:因为在D完全创建之前,B已经被创建。 所以先调用B的f(); D创建完后,根据动态性调用D的f(); 一般和特殊的关系: 像TPerson中的P 阅读全文
posted @ 2017-03-22 16:29 郑哲 阅读(245) 评论(0) 推荐(0) 编辑
摘要: p=sp; 让p指向了sp中的TPerson部分; 当delete p时,只释放了TPerson的部分,但没有释放TStudent的动态分配的部分,并且TStudent类已经无法使用,所以导致严重的内存泄露。 所以我们将在TPerson类的析构函数中加上virtual关键字。 改动后,通过p调用de 阅读全文
posted @ 2017-03-22 16:00 郑哲 阅读(103) 评论(0) 推荐(0) 编辑
摘要: 1重载:重载完全是一个编译时(或静态)的概念。 如果声明了同名函数,编译器会在编译时处理这些同名函数的调用问题,确定调用哪一个函数。 因此,在运行时不存在涉及调用重载函数的额外开销。 2覆盖:覆盖时运行时的概念,它在运行时从一组被覆盖的函数中选择一个函数。有额外的开销,但是基本可以忽略不计。 阅读全文
posted @ 2017-03-22 15:42 郑哲 阅读(458) 评论(0) 推荐(0) 编辑
摘要: void DisplayOutput(const TPerson& aPerson) { aPerson.Print(); } DisplayOutput()函数的参数是对TPerson类对象的引用。 但是在DisplayOutput中传入TStudent,TTeacher,又会有不同的实现(在TP 阅读全文
posted @ 2017-03-20 11:19 郑哲 阅读(139) 评论(0) 推荐(0) 编辑