1,从一个base class指针转为一个derived class指针叫做downcast.因为是从继承体系的上方移到下方。
据说downcast很丑陋,而由dynamic_cast实现的safe-downcasting好一点,但避免不了if-then-else 风格,虚函数可以搞定。万非得已,不要出此下策。
关于安全转型,dynamic_cast安全转型比static_cast的优势,在于能够侦测到是否转型成功,如果不成功则返回一个NULL指针。
if 语句可以定义变量;VC6没有支持这项新语法;
if(SavingAccount *psa = dynamic_cast<SavingsAccount*>(*p)){};
代替
SavingAccount *psa;
if(psa = dynamic_cast<SavingsAccount*>(*p)){};
2,什么叫layering?
所谓layering是指以一个class为本,建立另一个class,并令外层包含内层的对象作为数据成员。Thinging c++里面叫做组合。
举个例子
class Address{。。。};
class Person{
public:
。。。
private:
string name;
Address address;
};
如果说公有继承是Is-a,那么layering就意味着Has-a;如何在二者之间进行选择,需要分析
典型例子,是矩形和正方形,Set 和 List的关系。Set不内含重复元素,List和内含重复元素,所以用Is-a描述不恰当的。组合可以解决。