C++ 重載,隱藏和覆蓋透徹理解

重載:

    1:同一作用域,函數名相同,參數不同

    2:同一作用域,函數名相同,參數相同或者不同,函數返回值不同 【不是重載

    3:同一作用域,函數名相同,參數缺省值不同 【不是重載

隱藏:

    1:不同作用域,函數名相同

覆蓋:

     1:不同作用域,函數名相同,參數也相同,同時父類函數必須有virtual

 

#include <iostream>
#include <unistd.h>

using namespace std;

class Base
{
public:
	void f1(int arg) { cout << "Base f1(), int arg" << endl; }
	void f1(char arg) { cout << "Base f1(), char arg" << endl; }          //重載 f1()
	void f1(string arg) { cout << "Base f1(), string arg" << endl; }      //重載 f1()
	virtual void f2(int arg) { cout << "Base f2(), int arg" << endl; }
	virtual void f2(char arg) { cout << "Base f2(), char arg" << endl; }  //重載 f2()
	virtual void f3(int arg) { cout << "Base f3(), int arg" << endl; }
	virtual void f4(int arg) { cout << "Base f4(), int arg" << endl; }
};

class Derived : public Base
{
public:
	void f1(int arg) { cout << "Derived f1(), int arg" << endl; }    //隱藏Base::f1(int arg)
	void f1(char arg) { cout << "Derived f1(), char arg" << endl; }  //重載Derived::f1(), 同時隱藏Base::f1(char arg)
	void f1(float arg) { cout << "Derived f1(), float arg" << endl; }//重載Derived::f1(), 同時隱藏Base::f1(float arg)
	void f2(int arg) { cout << "Derived f2(), int arg" << endl; }    //重寫Base::f2(int arg)
	void f2(char arg) { cout << "Derived f2(), char arg" << endl;   }//重載Derived::f2(), 同時重寫Base::f2(char arg)
	void f2(float arg) { cout << "Derived f2(), float arg" << endl; }//重載Derived::f2(), 同時重寫Base::f2(float arg)
	virtual void f3(int arg) { cout << "Derived f3(), int arg" << endl; }//重寫Base::f3()
	void f4(char arg) { cout << "Derived f4(), char arg" << endl; }      //隱藏Base::f4(), 但是不能重寫Base::f4()
};

int main(void)
{
	Derived derived;

	Base *pbase = &derived;

	pbase->f1(50); pbase->f1('c'); pbase->f1("hello");  //隱藏測試
	//pbase->f1(3.14f);             //非法調用

	pbase->f2(50); pbase->f2('c');  //重寫測試
	//pbase->f2(3.14f);             //非法調用

	pbase->f3(50);                  //重寫測試

	pbase->f4(50);                  
	pbase->f4('c');                 
	while (true)
	{
		sleep(5);
	}
}

輸出結果如下:

Base f1(), int arg
Base f1(), char arg
Base f1(), string arg
Derived f2(), int arg
Derived f2(), char arg
Derived f3(), int arg
Base f4(), int arg
Base f4(), int arg
 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章