zoukankan      html  css  js  c++  java
  • 重写与多态(重写的两个错误)

    重写:1.在父子类中,子类重写父类函数    2.函数名同名  3.参数相同  4.父类的同名必须有virtual

    重写是动态联编,根据或引用实际指向的对象决定调用哪个类的函数

    多态:调用同名函数时,由于参数不同(重载)或由于所调用的对象(重写)不同造成调用结果不同

    重载和重写的区别:1.范围不同  2.参数要求不一样(重载:参数不同 重写:参数必须一样)  3.virtual要求不同  4.重载是静态联编,重写是动态联编

    重写的两种错误:

    1.子类与父类函数名相同,参数相同,但是父类没有virtual,只能发生静态联编  //没有编译错误 但是达不到效果

    2.子类与父类函数名相同,参数不同,都是静态联编

    class Parent
    {
    public:
    
        Parent()
        {
            cout<<"Parent()"<<endl;
            this->privata_data =0;
        }
        Parent(int k)
        {
            this->privata_data =k;
        }
    
        virtual void show(int p) //加上virtual就是动态联编了
        {
            cout<<"Parent:show"<<this->privata_data<<endl;
        }
        void setPrivatadata(int a)
        {
            this->privata_data = a;
        }
    
    int privata_data;
    };
    
    class Sub:public Parent
    {
    public:
        Sub()
        {
            cout<<"Sub()"<<endl;
            this->name = " ";
        }
    
        Sub(const string &name,int k=0):Parent(k)
        {
            cout<<"Sub(const string &name,int k=0):Parent(k"<<endl;
            this->name = name;
        }
        void show(string &name)
        {
            cout<<"Sub:show"<<this->name<<endl;
        }
    
        ~Sub()
        {
            cout<<"~Sub()"<<endl;
        }
    
    private:
        string name;
    };
    
    void showData(Parent *p)
    {
        p->show();
    }
      
    int main(int argc, char *argv[])
    {
    #if 1
        Parent *p = new Sub;//父类指针指向子类对象
        p->show();//静态联编,结果是调用父类的show函数
        delete p;
    #endif
    #if 1
        Parent *p = new Sub;
        p->show("xiaoli");  
        delete p;
    #endif
    }

    参数不同,此时不管父类有没有virtual都会被屏蔽掉

  • 相关阅读:
    JQuery:自动触发事件
    SQL Server 取日期时间部分
    使用IIS 7.0 / 7.5 时配置HttpModules需要注意
    Winform:中直接打开指定文件
    jQuery 时间获取扩展
    喵星史话(一)——猫的起源
    2013年的环法
    ie8下奇怪的问题:float:left之后,右侧的div会影响左侧
    虚假IP和DNS污染
    android中setBackgroundResource和setBackgroundDrawable和用法
  • 原文地址:https://www.cnblogs.com/xiaozoui11cl/p/12767491.html
Copyright © 2011-2022 走看看