elva

C++常识之——多态与重载

一.多态

多态(Polymorphism)按字面的意思就是“多种形状”。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。

  多态性是允许将父对象设置成为和一个和多个它的子对象相等的技术,比如Parent:=Child; 多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作.
  多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
  赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。
  举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。
  比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以附给其基类的对象,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。
  使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象 当作基类的的对象,这种认识又叫作upcasting。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适 应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。
  简单的说,建立一个父类的变量,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个变量调用这个函数的时候,定义这个变量的类,也就是父类,里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用
  class A {
  public:
  A() {}
  virtual void foo() {
  cout << "This is A." << endl;
  }
  };
  class B : public A {
  public:
  B() {}
  void foo() {
  cout << "This is B." << endl;
  }
  };
  int main(int argc, char* argv[]) {
  A *a = new B();
  a->foo();
  return 0;
  }
  这将显示:
  This is B.
  如果把virtual去掉,将显示:
  This is A.
  前面的多态实现使用抽象类,并定义了虚方法.

二.重载

重载决策是一种编译时机制,用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用。函数重载就是一个类中有几个同名函数但参数表不同:

重载分为普通方法重载和基类(也就是父类)虚方法的重载!

普通方法的重载指的是:类中两个以上的方法(包括隐藏的继承而来的方法),取的名字相同,但使用的参数类型或者参数个数不同!

对基类方法的重载是函数重载的另一种特殊形式。在派生类中重新定义此虚函数!方法名称,返回值类型,参数表中的参数个数,类型,顺序都必须和基类中的虚函数完全一致!在派生类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有new,static或virtual修饰符!(这是转载别人的,其实这个是重写override)

posted on 2009-08-19 09:56 叶子 阅读(2414) 评论(0)  编辑 收藏 引用 所属分类: C\C++


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理