C++ using聲明獲得的權限簡析

using聲明,形式如下:

using 作用域名::名字

還是先舉個例子:

class Base
{
public:
	int pubi;
	void pub()
	{
	};
};

class Derived1:public Base
{
public:
	using Base::pub;
};

其中 的using Base::pub就是using聲明。

下面再來看看測試代碼:

#include "stdafx.h"
#include <iostream>

using namespace std;

class Base
{
public:
	int pubi;
	void pub()
	{
		cout << "Base public" << endl;
	};
protected:
	int proi;
	void pro(){};
private:
	int prii;
	void pri(){};
};

class Derived1:public Base
{
public:
	using Base::pub;
	void pub(int i)
	{
		cout << "Derived1 public" << endl;
	}
};

class Derived2:public Base
{
public:
	void pub(int i)
	{
		cout << "Derived2 public" << endl;
	}
protected:
	using Base::pub;
};

class Derived3:public Base
{
public:
	using Base::pro;
	void pub(int i)
	{
		cout << "Derived1 public" << endl;
	}
	void test3()
	{
		pub();
	}
private:
	using Base::pub;
};

int _tmain(int argc, _TCHAR* argv[])
{
	Derived1 d1;
	d1.pub();
	Derived2 d2;
	//d2.pub();
	Derived3 d3;
	/*d3.pro();*/
	return 0;
}

1、Derived1、Derived2和Derived3中的using Base::pub,在最後的main函數裏面可以看出using聲明分別做了以下事情:

在Derived1中讓Base的public方法保持public,由此我們可以通過Derived1的對象d1訪問Base的public pub方法。

在Derived2中讓Base的public方法變爲protected,這樣通過Derived2的對象d2無法訪問protected pub方法。

在Derived2中讓Base的private方法變爲public,彷彿能通過Derived3的對象d3訪問public pub方法,能通過編譯,但是執行時不會返回任何結果。


2、在Derived3中我們又可以看出,即便是在private中用using聲明。也可以在整個Derived3作用域中(此處爲public中的test3方法)訪問using聲明的pub方法。

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