一个企业的网站建设,最好的编程培训机构,怎么自己编码做网站,网站建设阿胶膏的作用1.确定你的public继承塑造出is-a关系 public继承意味着is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derived classes对象也都是一个base class对象#xff0c;反过来不成立。 2.避免隐藏继承而来的名称 c名称查找不考虑类型#xff0…1.确定你的public继承塑造出is-a关系 public继承意味着is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derived classes对象也都是一个base class对象反过来不成立。 2.避免隐藏继承而来的名称 c名称查找不考虑类型只考虑名称。 class Base
{
private:int x;
public:virtual void mf1() 0;virtual void mf1(int){}virtual void mf2(){}void mf3(){}void mf3(double){}
};
class Derived :public Base
{
public:virtual void mf1(){}void mf3(){}void mf4(){}
};
/*
base class内所有名为mf1和mf3的函数都被derived class内的mf1和mf3函数遮掩掉
函数隐藏只与函数名称有关与函数的参数类型、是否virtual无关注意此处是静态绑定若通过指针或引用来调用虚函数此时是动态绑定不会发生函数隐藏
*/
int main()
{Derived d;int x 1;d.mf1();//ok//d.mf1(x);//falsed.mf2();//okd.mf3();//ok//d.mf3(x);//false
system(pause);return 0;
} class Base
{
private:int x;
public:virtual void mf1() 0;virtual void mf1(int){}virtual void mf2(){}void mf3(){}void mf3(double){}
};class Derived :public Base
{
public:using Base::mf1;using Base::mf3;virtual void mf1(){}void mf3(){}void mf4(){}
};/*
如果你继承base class并且base class中有重载函数而你又希望在派生类中重新定义其中一部分那么你必须为那些
原本会被隐藏的每个名称引入一个using声明式否则某些你希望继承的名称会被隐藏。using声明式会令继承而来的基类中某给定名称之所有同名函数在derived class中都可见
*/
int main()
{Derived d;int x 1;d.mf1();//okd.mf1(x);//okd.mf2();//okd.mf3();//okd.mf3(x);//ok
system(pause);return 0;
} 3.区分接口继承和实现继承 声明一个pure virtual函数的目的是为了让derived classes只继承函数接口通常纯虚函数没有定义但是可以为纯虚函数提供定义调用它的唯一途径是调用时明确指出其class名称 class Shape
{
public:virtual void draw() const 0{}virtual void error(const string msg);int objectID() const;
};class Rectangle:public Shape
{
public:virtual void draw() const{}
};class Ellipse:public Shape
{
public:virtual void draw() const {}
};int main()
{//Shape *ps new Shape;//error 抽象类不能生成实例Shape *ps1 new Rectangle;ps1-draw();Shape *ps2 new Ellipse;ps2-draw();ps1-Shape::draw();ps2-Shape::draw();system(pause);return 0;
} 声明impure virtual函数的目的是让derived class继承该函数的接口和缺省实现如果有的派生类只想继承接口但忘记重新定义该虚函数这样一来就会使用基类缺省实现出错:将接口和缺省实现分开派生类如果想使用缺省实现需要去显式调用 方案一将接口定义为纯虚函数缺省实现定义为non-virtual函数派生类若想使用缺省实现需要在继承而来的纯虚函数中调用该non-virtual函数派生类若只想继承接口此时不会忘记重新定义该虚函数了因为不重新定义的话就是抽象类无法实例化 方案二:纯虚函数必须在derived class中重新定义但基类中也可以为纯虚函数提供定义该定义作为缺省实现。派生类若想使用缺省实现需要在在继承而来的纯虚函数中通过基类名来显式调用上述函数定义 声明non-virtual函数的目的是为了令derived class继承函数的接口及一份强制性实现4.考虑virtual函数以外的其他选择 NVI手法令用户通过public non-virtual成员函数间接调用private virtual函数由Function Pointer实现strategy模式运用函数指针(作为类的成员变量)替换virtual函数优点是每个对象可各自拥有自己的对应函数及可在运行期改变该函数缺点是可能会降低类的封装性 由tr1::function完成strategy模式古典的strategy模式5.绝不重新定义继承而来的non-virtual函数设计理念 6.绝不重新定义继承而来的缺省参数值 虚函数是动态绑定的而缺省参数值是静态绑定的。 class Shape
{
public:enum ShapeColor{Red,Green,Blue};virtual void draw(ShapeColor color Red) const 0;
};class Circle :public Shape
{
public:/*当用户以对象调用此函数一定要指定参数值。因为静态绑定下这个函数并不从其基类继承缺省参数值。但若以指针或引用调用此函数可以不指定参数值因为动态绑定下这个函数会从其基类继承缺省参数值*/virtual void draw(ShapeColor color) const;
}; 7.通过复合composition塑造出has-a或根据某物实现出 复合某种类型的对象内含别的类型的对象复合意味着has-a或is-implemented-in-terms-of 8.明智地使用private继承 如果class之间的继承关系是private,编译器不会自动将一个derived class对象转换为一个base class对象将派生类实参传递给基类形参编译出错由private base class继承而来的所有成员在derived class中都会变成private属性纵使它们在base class中原本是protected或public属性即派生类对象不能调用基类方法private继承意味着implemented-in-terms-of,private继承纯粹只是一种实现技术。 9.明智地使用多重继承 未完待续转载于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/5819125.html