摘要:
1、绝不在构造和析构过程中调用virtual方法,为啥? 原因很简单,对于前者,这种情况下,子类专有成分还没有构造,对于后者,子类专有成分已经销毁,因此调用的并不是子类重写的方法,这不是程序员所期望的。2、在构造方法和析构方法中,直接调用virtual方法,很容易识别。还有一种情况要注意,那就是间接调用。比如:构造方法调用init方法,而init方法调用virtual方法。3、在构造过程中,不能使用virtual从上到下调用,哪有什么办法弥补呢? 可以将子类必要的信息向上传递给父类构造方法。 阅读全文
posted @ 2014-01-16 21:11
Andy Niu
阅读(270)
评论(0)
推荐(0)
摘要:
1、考虑一个类Widget,析构方法抛出异常,一个集合中包含10个Widget对象,集合离开作用域,逆序撤销集合里的对象,最后一个抛出异常,倒数第二个抛出异常,问题出现了,这种情况下,要么导致程序结束,要么导致不明确行为。2、因此,绝不能在析构方法中抛出异常。考虑,数据库连接类DBConn,用户可能会忘记关闭连接,因此在DBConn的析构方法中,执行Close方法。那么问题来了,close方法可能会抛出异常,怎么办? a、在析构方法中,捕获异常,结束程序,这种方法可用性太差。 b、在析构方法中,捕获异常,吞下异常,这种方法忽略错误,程序继续运行,接下来可能会导致不明确行为。3、上面两种解决.. 阅读全文
posted @ 2014-01-16 21:00
Andy Niu
阅读(291)
评论(0)
推荐(0)
摘要:
1、思考,对于C++,能不能在外部调用私有方法?2、在Java中,子类继承不能缩小父类成员的访问权限。因为在Java中,继承只是表示Is-A关系,因此,父类提供的接口,子类必须承诺仍然提供,不能缩小访问权限,但是可以放大权限。3、在C++中,继承不光表示Is-A关系,还可以表示根据某物实现出。因此,在C++中,子类可以放大或者缩小父类成员的访问权限。考虑,如果父类提供public virtual方法,子类重写为private virtual方法,我们知道,重写只不过是,子类整体拷贝父类的虚方法表,对于重写的方法偷梁换柱,替换为重写后的方法。在这种情况下,父类指针指向子类对象,父类指针通过调用p 阅读全文
posted @ 2014-01-16 20:34
Andy Niu
阅读(4841)
评论(0)
推荐(1)
摘要:
1、考虑下面的需要,需要一个工厂方法。工厂方法的规则是:在堆上分配一个子类对象,并返回父类指针。使用完毕,delete父类指针。如果父类的析构方法不是virtual,将直接调用父类的析构方法,导致局部销毁的对象,父类成分销毁了,子类成分没有销毁。2、如果类中有virtual方法,意味着面向抽象编程,也就是会有父类指针指向子类对象,因此这种情况下,必定需要一个virtual析构方法。3、如果类中没有virtual方法,为了节省空间,析构方法是non-virtual方法。也就意味着,这个类不作为父类。如果你继承这样的类,就会导致上面的局部销毁对象。Java中有final,C#中sealed,禁止继 阅读全文
posted @ 2014-01-16 19:53
Andy Niu
阅读(367)
评论(0)
推荐(0)
摘要:
1、C++构造和析构的过程,类似于穿衣脱衣的过程。穿衣是:先穿内衣,再穿外套。脱衣是:先脱外套,再脱内衣。C++构造过程:首先调用父类构造方法,再调用子类构造方法。C++析构过程:首先调用子类析构方法,再调用父类析构方法。2、子类不能继承父类的构造方法和析构方法,除此之外,其他的成员都能继承,包括父类的private成员,只不过子类不能访问private成员。3、思考一下,为什么子类不能继承父类的构造方法? 想一想,构造方法是干什么的?构造方法是初始化对象的成分,创建对象。从语义上讲,父类构造方法初始化父类成分,构造父类对象。子类构造方法在父类对象的基础上,初始化子类专有成分,构造子类对象。. 阅读全文
posted @ 2014-01-16 19:12
Andy Niu
阅读(4065)
评论(0)
推荐(1)
浙公网安备 33010602011771号