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

              




  • 相关阅读:
    linux使用jstack来找出死循环的java代码
    Dubbo的几种序列化协议
    上传新项目到GitLab
    PI Network项目,手把手教快速挖Pi币
    Oracle数据导出、导入
    如何实现表单标题两端对齐
    cookie 操作记录& vuex 中页面刷新 state 数据丢失的问题
    FCSAN存储与服务器关联映射后在服务器端如何识别操作
    修改密码报-bash: !@#***": event not found
    springboot整合logstash
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5317244.html
Copyright © 2011-2022 走看看