zoukankan      html  css  js  c++  java
  • 11-多态与继承(上)

    一.函数重写

        *: 在子类中定义与父类中原型同样的函数

        *: 函数重写仅仅发生在父类与子类之间

    class Parent
    {
    public:
    	void print()
    	{
    		cout<<"parent"<<endl;
    	}	
    };
    class Child:public Parent
    {
    public:
    	void print()
    	{
    		cout<<"child"<<endl;
    	}
    };
        

          说明: print() 就为重写函数

           *: 父类中被重写的函数依旧会继承给子类

           *: 默认情况下子类重写的函数将隐藏父类中的函数

           *:通过作用域分辨符::能够訪问到父类中被隐藏的函数

    	child.print();
    	child.Parent::print();


          当函数重写遇上赋值兼容性原则


    void run()
    {
    	Child child;
    	
    	Parent* pp = &child;
    	Parent& rp =child;
    	
    	child.print();
    	pp->print();
    	rp.print();
    }

                             
          问题所在:
           (1) C++与C同样,是静态编译型语言

           (2) 在编译时,编译器自己主动依据指针的类型推断指向的是一个什么样的对象

           (3) 所以编译器觉得父类指针指向的是父类对象

           (4) 因为程序没有执行。所以不可能知道父类指针指向的详细是父类对象还是子类对象

           (5) 从程序安全的角度。编译器如果父类指针仅仅指向父类对象。因此编译的结果为调用父类的成员函数。                            

    void func(Parent* p)
    {
    	p->print();
    }

       分析: 在编译这个函数的时候,编译器不可能知道指针P指向什么,可是没有理由报错,于是编译器觉得

    最安全的做法是编译到父类的print函数。

    二. 多态的本质

         依据实际的对象类型决定函数调用语句的详细调用目标

    *: 假设父类指针指向的是父类对象,则调用父类中定义的函数

            *: 假设父类指针指向的是子类对象,则调用子类中定义的重写函数

          多态: 相同的调用语句有多种不同的表现形态

         

           C++中的多态支持

               *:  C++中通过 virtual keyword对多态进行支持

               *:  使用virtual声明的函数被重写后就可以表现出多态性

    父类函数中增加virtual

    class Parent
    {
    public:
    	
    	virtual void print()
    	{
    		cout<<"parent"<<endl;
    	}	
    };



    小结:
           (1) 函数重写仅仅可能发生在父类与子类之间

           (2) virtual keyword是C++中支持多态的唯一方式

           (3) 被重写的虚函数就可以表现出多态性

              




  • 相关阅读:
    对于Sobel算子的学习
    HDU 2594(求最长公共前后缀 kmp)
    HDU 6108(整除判断 数学)
    HDU 5968(异或计算 暴力)
    HDU 5963(游戏 博弈+规律)
    简单算法考题记录
    flex与bison
    C++ 智能指针
    Linux 添加设备驱动程序
    Linux 添加系统调用
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5317244.html
Copyright © 2011-2022 走看看