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) 被重写的虚函数就可以表现出多态性

              




  • 相关阅读:
    leetcode 13. Roman to Integer
    python 判断是否为有效域名
    leetcode 169. Majority Element
    leetcode 733. Flood Fill
    最大信息系数——检测变量之间非线性相关性
    leetcode 453. Minimum Moves to Equal Array Elements
    leetcode 492. Construct the Rectangle
    leetcode 598. Range Addition II
    leetcode 349. Intersection of Two Arrays
    leetcode 171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5317244.html
Copyright © 2011-2022 走看看