우원류 와 계승


C + + Primer 에는 다음 과 같은 설명 이 있 습 니 다. 친구 관 계 는 계승 할 수 없습니다.기본 클래스 의 우 원 은 파생 클래스 의 구성원 에 게 특별한 접근 권한 이 없습니다.기본 클래스 가 친구 관계 에 부여 되면 기본 클래스 만 특수 접근 권한 을 가지 고 있 으 며, 이 기본 클래스 의 파생 클래스 는 친구 관계 에 부여 되 는 클래스 에 접근 할 수 없습니다.
 그러나 실천 을 통 해 알 수 있 듯 이 VS 컴 파일 러 는 상기 설명 을 설치 하지 않 고 아래 의 규칙 은 상기 설명 과 어 긋 나 지만 VS 컴 파일 러 의 처리 규칙 에 부합된다.
주: g + 컴 파일 러 를 통 해 검증 해 야 합 니 다.
1. 유원류 의 계승 문제
1.1 A 클래스 의 유원 B 의 파생 클래스 C 는 A 클래스 의 private 나 protect 멤버 변 수 를 방문 할 수 없습니다.하지만 B 가 제공 하 는 인 터 페 이 스 를 통 해 A 에 접근 할 수 있다.(쓸데없는 말 은 할 수 있다)
#include <iostream> 
using namespace   std; 
class B; 
class A 
{ 
	int a; 
public: 
	A(int x=0) { a=x; } 
	friend class B; 
}; 
class B 
{ 
	int b; 
public: 
	void fun(A& ob){ cout << ob.a << endl;} 
}; 

class C:public B
{ 
public: 
	//void fun2(A& ob){ cout <<ob.a <<endl;}   //             A,     
}; 

void   main() 
{ 
	A a(55); 
	C c; 
	c.fun(a); //C B           B   fun       
} 

1.2.  Base 의 친구 들 은 Base 의 파생 클래스 인 Drived 를 통 해 Base 의 private, protect 멤버 변 수 를 방문 할 수 있 지만, Drived 의 private, protect 멤버 변 수 는 방문 할 수 없습니다.(이 점 은 'C + + primer' 에서 말 한 것 과 약간 충돌 하 는 것 같다)
개인 적 인 이해: Drived 의 대상 자체 에 Base 가 포함 되 어 있 고 Base 의 친구 인 Frnd 는 자연히 Base 의 부분 을 방문 할 수 있 습 니 다.
#include <iostream> 
using namespace std; 
class Base 
{ 
	int m_a; 
public: 
	Base(int x=0){ m_a=x; } 
	friend class Frnd; 
}; 

class Drived:public Base 
{ 
private:
	int m_c;
public: 
	Drived(int x):Base(x){m_c=x;} 
};

class Frnd 
{
public: 
	void fun(Base& ob) { cout <<ob.m_a << endl; } 
	void fun2(Drived& ob) 
	{
		cout << ob.m_a<<endl;
		//cout <<ob.m_c<<endl; //    
	} 
}; 

int main() 
{ 
	Drived d(1); 
	Frnd f; 
	f.fun(d); 
	f.fun2(d);
	system("pause");
	return 0;
} 

3. 우 원류 의 전달 문제
A 의 우 원 은 B, B 의 우 원 은 C, A 의 우 원 은 C?아니, 우 원 류 는 전달 성 이 없어.

좋은 웹페이지 즐겨찾기