网站开发项目时序图,介绍旅游美食的网站模板,google怎么做网站推广,点评网页设计作业条款36#xff1a;绝不重新定义继承而来的non-virtual函数non-virtual函数执行的是静态绑定#xff0c;在编译器就已经决定#xff0c;因此对象对用的函数只和指针的类型有关#xff0c;而与指针所指的对象无关#xff1b;记住non-virtual函数的性质#xff1a;不变性凌驾…条款36绝不重新定义继承而来的non-virtual函数non-virtual函数执行的是静态绑定在编译器就已经决定因此对象对用的函数只和指针的类型有关而与指针所指的对象无关记住non-virtual函数的性质不变性凌驾于特异性
条款37绝不重新定义继承而来的缺省参数值静态类型是指在程序中声明时使用的类型动态类型是指目前所指对象的类型动态类型变现为一个对象将会有什么样的行为non-virtual和参数缺省值执行的是静态绑定virtual执行的是动态绑定,代码分析
class shape{
public:enum shapecolor { red, green, blue };virtual void draw(shapecolor colorred) const0;
};
class rectangle:public shape{
public:virtual void draw(shapecolor colorgreen) const;//糟糕的操作...
}
class circlepublic shape{
public:virtual void draw(shapecolor color)const;...
};
调用 shape *prnew rectangle;pr-draw( );//执行的代码为rectangle::draw(shape::red)://相当于shape执行缺省rectangle执行virtual函数一人一半神奇的操作
C这样设计的原因运行期效率如果缺省值是动态绑定编译器就必须用某种方法在运行期为virtual函数决定适当的参数缺省值这比目前实现的在编译期决定的机制更慢更加复杂
条款38通过复合塑模出has-a或者根据某物实现出复合是类型之间的一种关系当某种类型的对象内含它种类型的对象就是这种关系复合有两种意义复合意味着has-a(有一个或is-implemented-in-terms-of(根据某物实现出)如何区分is-a(是一种和is-implemented-in-terms-of根据某物实现出这两种关系可以通过public继承中D继承BD对象也是B对象反之B对象不是D对象来判断
条款39明智而审慎地使用private继承private继承意味着implemented-in-terms-of复合它只有实现部分被继承接口部分省略private继承纯粹是一种实现技术它在软件设计层面上没有意义其意义只及于软件实现层面代码分析class person {...};class student:private person{ . . .};void eat(const personp);person p; student s; eat(p);eat(s);//编译不通过
原因1private继承中编译器不会自动将一个derived class对象转换为一个base class对象2private继承而来的所有成员在derived class中都会变成private属性纵使它们在base class中原本是public或者protected; 尽可能的多用复合必要的时候才使用private继承protected成员和virtual函数牵涉进来的时候或者继承一个empty class时候可以采用private继承需求定义一个类B继承一个类B_B使得这个类的派生D不能调用B_B的成员函数
设计1private继承
class B_B{ class D:private B_B{
public private: explicit B_B(int tickfrency); virtual void ontick( ) const;virtual void ontick( )const;
}; };
设计2继承复合
class D{
private:class widgettimer:public B_B{public: virtual void ontick( )const;...};widgwttimer timer;
}
在D内声明一个嵌套式private class后者以public继承B_B并重新定义ontick,然后放这个类型在D对象内
选择方案2不选择方案1的原因1想阻止D的derived class重新定义ontick函数2降低D编译的依存性empty class:没有non_static成员变量没有virtual函数没有virtual base classempty class数据大小并不是零C规定凡是独立对象都必须有非零大小这个约束不针对derived class 中的base class成分它们是非独立的因此一个empty class 大小为1C规定安插一个char类型到空对象中在继承empty class中如果选择private继承EBO,empty base optimization继承空类可能造成empty base的最优化