#include <iostream>
using
namespace
std;
class
A
{
protected
:
//通常这里为protected
virtual
void
display (){cout<<
"A virtual void display ()"
<< endl;}
//此处若有=0,则A为抽象类
} ;
class
B:
public
A
{
protected
:
B(){cout<<
"B()"
<<endl;}
~B(){cout<<
"~B()"
<<endl;display();}
virtual
void
display(){ cout<<
"B virtual void display ()"
<<endl;
}
//派生类中有虚函数
};
class
C:
public
B
{
public
:
C(){cout<<
"C()"
<<endl;}
~C(){cout<<
"~C()"
<<endl;}
};
main()
{
C c;
system
(
"pause"
);
return
0;
}
*****************************************
Q:
1、
派生类对象如何调用基类的成员函数,特别是protected的成员函数?
2、
如何通过基类对象访问派生类的成员函数,特别是基类没有定义的某些方法?
3、
建立对象时,调用构造函数的顺序,析构函数的顺序?
4、
区分覆盖、继承、多态、重载
待分析解决
*******************************************************************
多态有两种表现形式:重载和覆盖。
重载(overload):是发生在同一类中。与什么父类子类、继承毫无关系。标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!覆盖(override):是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系。多态:是父类调子类的实现,继承是子类调父类的实现,由于多态时不知道会被哪个子类继承,所以定义的东西都是虚函数,当你执行这个虚函数时,首先找到该虚函数代表的实体子类,并执行子类中的相关代码。
**************************************************************************
比如有一个父类superClass,它有2个子类subClass1,subClass2。superClass有一个方法 func(),两个子类都重写了这个方法。那么我们可以定义一个superClass的引用obj,让它指向一个子类的对象,比如superClass obj = new subClass1();那么我们调用obj.func()方法时候,会进行动态绑定,也就是obj它的实际类型的func()方法,即subClass1的func()方法。同样你写superClass obj = new subClass2();obj.func()其实调用的是subClass2的func()方法。这种由于子类重写父类方法,然后用父类引用指向子类对象,调用方法时候会进行动态绑定,这就是多态。多态对程序的扩展具有非常大的作用,比如你要再有一个subClass3,你需要改动的东西会少很多,要是使用了配置文件那就可以不动源代码了。