面向对象的三个基本特征
面向对象的三个基本特征是:封装、继承、多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!
多态: 为了使同一方法在基类和派生类中的实现可以不同。
多态的实现:
1、在派生类中重新定义基类的方法
2、使用虚方法
如果要在派生类中重新定义基类的方法,通常将基类方法声明为虚方法
如果方法是通过引用或指针调用而不是对象直接调用,使用哪一种方法将有两种情况:
1、如果在基类中没有将方法声明为virtual函数,则将根据引用或指针的类型选择使用哪一种方法
如:
//BassPlus是Bass的派生类
//ViewAcct()是非虚函数
Barss dom("Dominic" , 1124, 432.45);
BassPlus dot("Dorothy", 11234, 345.00);
Barss & b1_ref=dom;
Barss & b2_ref=dot;
b1_ref.ViewAcct(); //use Barss::ViewAcct()
b2_ref.ViewAcct(); //use Barss::ViewAcct()
由于 ViewAcct()为非虚函数,因此将根据引用的类型而不是其所指的对象的类型确定所调用的方法。使用Brass指针替换引用,得到的效果相同
2、如果在基类中将方法声明为virtual函数,则将根据引用或指针所指对象的类型选择使用哪一种方法
//BassPlus是Bass的派生类
//ViewAcct()是虚函数
Barss dom("Dominic" , 1124, 432.45);
BassPlus dot("Dorothy", 11234, 345.00);
Barss & b1_ref=dom;
Barss & b2_ref=dot;
b1_ref.ViewAcct(); //use Barss::ViewAcct()
b2_ref.ViewAcct(); //use BarssPlus::ViewAcct()
由于 ViewAcct()为虚函数,因此将根据引用所指对象的类型确定所调用的方法。b1_ref所指的对象为Barss,b2_ref所指的对象为BarssPlus。使用Brass指针替换引用,得到的效果相同
例子:(2012某**软件公司笔试题)
请按顺序写出下面代码的输出结果:
答案:call child func
call ~child
call ~base
方法在基类中被声明为virtual后,在基类中会自动生成为virtual方法,但通常还是会在派生类中使用virtual关键字
参考:
C++封装、继承、多态 - ruyue_ruyue的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/ruyue_ruyue/article/details/8211809
浅谈C++多态性 - Hackbuteer1的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/hackbuteer1/article/details/7475622