重载、覆盖、隐藏、多态

2018年1月3日 3042点热度 0人点赞 0条评论
    1. 重载
      1. 在同一个作用域内
      2. 函数名相同
      3. 参数不同,可以是数量或类型
      4. 其他因素:
        1.  virtual、static不影响重载
        2. 返回值类型不同不影响重载
        3. 部分函数类型限定符,如写在成员函数参数列表后的const,影响重载
      5. 示例:
          • 
            class A {
            public:
            	void f(int) {}
            	void f(float) {}
            	void f(int) const {}
            	void f(int, int) {}
            	//int f(int){}
            	//virtual void f(int) {}
            };
            
    2. 覆盖
      1. 不在同一作用域,即分别位于子类和父类中
      2. 函数名相同
      3. 参数相同,返回值相同
      4. 父类中函数前必须有virtual关键字
      5. 示例
        • class A {
          public:
          	virtual void f(int) {}
          };
          class B : public A {
          public:
                  void f(int) {}
          };
    3. 隐藏
      1. 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual 关键字,基类的函数将被隐藏(注意别与重载混淆).
      2. 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏.
      3. 示例
        • class A {
          public:
          	virtual void f(int) {}
          	void g(int){}
          };
          class B : public A {
          public:
          	void f(float) {}
          	void g(int){}
          };
          
    4. 多态
      1. 多态是面向对象模型的重要思想,是指
      2. 多态既可以作用于成员函数多态也可以作用于成员变量,b
      3. 多态可分为“动态多态”:就是常见多态,还有“静态多态”
      4. 动态多态的主要实现方式是覆盖,使用显式接口,虚函数
      5. 静态多态体现在重载和模板编程,对于相关的对象类型,直接实现它们各自的定义,不需要共有基类,甚至可以没有任何关系。只需要各个具体类的实现中要求相同的接口声明,这里的接口称之为隐式接口。客户端把操作这些对象的函数定义为模板,当需要操作什么类型的对象时,直接对模板指定该类型实参即可(或通过实参演绎获得)。相对于面向对象编程中,以显式接口和运行期多态(虚函数)实现动态多态,在模板编程及泛型编程中,是以隐式接口和编译器多态来实现静态多态。
      6. 静态多态示例:
        • class A {
          public:
          	void f(){}
          };
          class B{
          public:
          	void f(){}
          };
          template
          void fun(T t) {
          	t.f();
          }
          int main(int argc, char** argv) {
          	A a;
          	B b;
          	fun(a);
          	fun(b);
          	system("pause");
          	return 0;
          };
          

icebmji

这个人很懒,什么都没留下