• C++学习笔记24,方法重写与方法隐藏


    该博文仅用于交流学习。请慎用于不论什么商业用途。本博主保留对该博文的一切权利。
    博主博客:http://blog.csdn.net/qq844352155

    转载请注明出处:


    方法重写.是指在子类中又一次编写父类中的虚函数的实现.要求子类中的函数必须跟父类中的原型一致.

    包含返回值类型(协变返回类型不算)以及參数的数目,排列顺序.

    #include <iostream>
    #include <string>
    using namespace std;
    class base{
    public:
    	virtual	void show(int i,string s){
    		cout<<i<<"+"<<s<<endl;
    		cout<<"This is base show!"<<endl;
    	}
    };
    class dirved:public base{
    public:
    	virtual void show(int i,string s){
    		cout<<i<<"&"<<s<<endl;
    		cout<<"This is dirved show!"<<endl;
    	}
    };
    
    int main(){
    	base b;
    	b.show(10,"base");
    	dirved d;
    	d.show(20,"dirved");
    }


    通过方法的重写,就可以定义同一函数在继承层次中的不同行为!

    假设在子类中使用父类虚方法的名称,可是參数不同,那么这个不是重写父类的方法,也不会重载方法,而是创建一个新方法.

    #include <iostream>
    #include <string>
    using namespace std;
    class base{
    public:
    	virtual	void show(int i,string s){
    		cout<<i<<"+"<<s<<endl;
    		cout<<"This is base show!"<<endl;
    	}
    };
    class dirved:public base{
    public:
    	/*
    	virtual void show(int i,string s){
    		cout<<i<<"&"<<s<<endl;
    		cout<<"This is dirved show!"<<endl;
    	}*/
    	virtual void show(){
    		cout<<"This is void dirved show!"<<endl;
    	}
    };
    
    int main(){
    	base b;
    	b.show(10,"base");
    	dirved d;
    	//d.show(20,"dirved");
    	d.show();
    }

    这个时候,父类中的show()方法将被隐藏,即dirved类中无法再使用show(int,string)方法.

    #include <iostream>
    #include <string>
    using namespace std;
    class base{
    public:
    	virtual	void show(int i,string s){
    		cout<<i<<"+"<<s<<endl;
    		cout<<"This is base show!"<<endl;
    	}
    };
    class dirved:public base{
    public:
    	/*
    	virtual void show(int i,string s){
    		cout<<i<<"&"<<s<<endl;
    		cout<<"This is dirved show!"<<endl;
    	}*/
    	virtual void show(){
    		cout<<"This is void dirved show!"<<endl;
    	}
    };
    
    int main(){
    	base b;
    	b.show(10,"base");
    	dirved d;
    	d.show(20,"dirved");
    	d.show();
    }
    编译结果:



    能够看出,对于dirved类来说,show(int,string)这种方法被隐藏起来了,即对于dirved对象来说不可见了!因此仅仅要在子类中又一次定义了父类的虚方法,父类中的全部与该方法重载的方法都将被隐藏!

    这一点须要特别注意!

    以下再看一些有趣的东西:

    #include <iostream>
    #include <string>
    using namespace std;
    class base{
    public:
    	virtual	void show(int i,string s){
    		cout<<i<<"+"<<s<<endl;
    		cout<<"This is base show!"<<endl;
    	}
    };
    class dirved:public base{
    public:
    	virtual void show(int i,string s){
    		cout<<i<<"&"<<s<<endl;
    		cout<<"This is dirved show!"<<endl;
    	}
    };
    
    int main(){
    
    	dirved d;
    	d.show(10,"show()");
    	base &ref=d;
    	ref.show(100,"ref show()");
    }

    子类中正确的重写了父类中的show方法,


    结果没有疑问.可是假设你重写子类的show方法的时候,发现应该用double取代int,于是i更改为

    #include <iostream>
    #include <string>
    using namespace std;
    class base{
    public:
    	virtual	void show(int i,string s){
    		cout<<i<<"+"<<s<<endl;
    		cout<<"This is base show!"<<endl;
    	}
    };
    class dirved:public base{
    public:
    	virtual void show(double i,string s){
    		cout<<i<<"&"<<s<<endl;
    		cout<<"This is dirved show!"<<endl;
    	}
    };
    
    int main(){
    
    	dirved d;
    	d.show(10,"show()");
    	base &ref=d;
    	ref.show(100,"ref show()");
    }

    执行结果:


    看到没有!最后那个ref.show(int,string)调用了base里面的show方法!(100能够换成9.8更明显)

    明明是dirved对象的引用,怎么就调用了base里面的show方法呢?由于这实际上是创建了一个新方法!

    可用overridekeyword来避免这样的情况!

    #include <iostream>
    #include <string>
    using namespace std;
    class base{
    public:
    	virtual	void show(int i,string s){
    		cout<<i<<"+"<<s<<endl;
    		cout<<"This is base show!"<<endl;
    	}
    };
    class dirved:public base{
    public:
    	virtual void show(double i,string s)override{
    		cout<<i<<"&"<<s<<endl;
    		cout<<"This is dirved show!"<<endl;
    	}
    };
    
    int main(){
    
    	dirved d;
    	d.show(10,"show()");
    	base &ref=d;
    	ref.show(95.9,"ref show()");
    }

    override表示你是想要重写base类的show方法而不是创建一个新的show方法,因此假设參数不正确就会报错!

    须要注意的是,即便是重写,仅仅要在子类中又一次定义了,父类中的对应重载函数都将会被隐藏!

    假设不想既想使用父类中的show,又想重写某一个show(),能够利用using 

    #include <iostream>
    #include <string>
    using namespace std;
    class base{
    public:
    	virtual	void show(int i,string s){
    		cout<<i<<"+"<<s<<endl;
    		cout<<"This is base show!"<<endl;
    	}
    	virtual void show(){
    		cout<<"this is a void show"<<endl;	
    	}
    };
    class dirved:public base{
    public:
    	//using 
    	using base::show;
    	virtual void show(int i,string s)override{
    		cout<<i<<"&"<<s<<endl;
    		cout<<"This is dirved show!"<<endl;
    	}
    };
    
    int main(){
    
    	dirved d;
    	d.show(10,"show()");
    	base &ref=d;
    	ref.show(95.9,"ref show()");
    	d.show();
    }


    这样就两全其美啦!


  • 相关阅读:
    多态中的虚析构函数
    mysql-2-where
    mysql-1-select
    高维稀疏数据的异常检测
    隐马尔可夫模型 Hidden Markov Model
    协同过滤 Collaborative Filtering
    内容推荐
    推荐系统中的基本问题
    HDR视频生态圈追踪
    从强提醒说起——社交场景下的万有“隐力”
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6834836.html
Copyright © 2020-2023  润新知