차이가 뭘까 '공개', '개인' 및 '보호' 상속 c++컴파일러는? 그래서 모든 질문에 대해 구체적인 사례, ve I& # 39 에 계약을 맺었다.
class A
{
public:
int x;
protected:
int y;
private:
int z;
};
class B : public A
{
// x is public
// y is protected
// z is not accessible from B
};
class C : protected A
{
// x is protected
// y is protected
// z is not accessible from C
};
class D : private A // 'private' is default for classes
{
// x is private
// y is private
// z is not accessible from D
};
중요: 클래스 B, C, D 가 모든 변수 x, y, z. 바로 질문에 액세스입니다.
개인 정보 보호 및 이용 상속 here 읽을 수 있습니다.
이제.
class Base {
public:
int publicMember;
protected:
int protectedMember;
private:
int privateMember;
};
,, 내 말은 " 존재를 인정하고 of" " 의해 인식되지 수 있을 것이고, 따라서 access".
인터넷을 통해, 개인 및 금지되었는지 같은 일이 발생합니까 출력한다. # 39, s 클래스의 하위 클래스 고려해보십시오 let& '와' 기본 '에서' 기본 '을 뜻한다.
클래스 상속 발쿰치로 코드를 볼 수 없는 일부 제한하는 가시도로 상속됩니다 다른 클래스: # 39 의 기본 won& 암시적입니다 변환에는 파생됨 '및' t work, static_cast, t # 39 를 기준에서 won& 파생됨 작업 중 하나.
클래스의 상속, pbs. 멤버만 / 친구들 볼 수 있는 친구, 유도 클래스 상속 금지되었는지 멤버만 / 볼 수 있다.
클래스 버튼: public 창 {};
구조체입니다 empty_pair_impl: 금지되었는지 empty_class_1 {non_empty_class_2 두 번째. };
구조체입니다 페어당: 개인 empty_pair_impl { & non_empty_class_2, 둘째 () { this-> 반품하십시오, 둘째. }
empty_class_1 &, 최초의 () {
이 반품하십시오. * 이 반품하십시오 // 있습니다! } };
보면안돼 * 상속
유형 이름 StorageModel> template<; 구조체입니다 구체화하십시오: 개인 스토라가모델 { 공개: void 대해 realloc 을 수행할 () { /dev/raw/raw1 상속됨 함수은 // 스토라가모델 대해 realloc 을 수행할 (); } };
클래스 쌍 { 공개: 먼저 첫 번째. 두 번째, 두 번째 };
클래스 창 { 공개: const int 제프리데스 (); };
클래스 스택할 { 금지되었는지: vector< element>; c. };
클래스 창 { 금지되었는지: void 레지스터클레스 (window_descriptor w). };
클래스 창 { 개인: int 너버. };
단, 파생 클래스 (base class c 스타일 방송 캐스팅 고의로 보호 또는 전용인지를 수 있는 방식으로 정의 및 안전 및 다른 방향선이 들어가도록 한다. 이 코드를 만들 수 있으므로 피해야 한다는 dell. 비용을 모두 구현 세부 정보를 이용할 수 있습니다 - 종속적임 신앙이니라 필요한 이 기술이다.
이 회사는 어떻게 함께 할 것이다. (base class) 의 파생 클래스 멤버 노출되어 있다.
< ul>; < > li>, 공개 -;; # 39 명 (일반적으로 기본) 의 기본 class& 공개 될 것이다. > 금지되었는지 li> <;; # 39 의 멤버 금지되었는지 기본 class& 될 것이다. 개인 - > li> <;; # 39 의 기본 class& 멤버여야 pbs. 될 것이다. < /ul>;
<! - 모든 언어: c++컴파일러는 > -; 이러한 세 가지 키워드로 사용되는 완전히 다른 컨텍스트로 상속 모델 가시도로 지정할 수 있다.
이 표는 모두 취합합니다 사용 가능한 조합 구성 요소의 하위 구성 요소를 프리젠테이션하기 상속 모델 선언 및 결과 액세스하려면 때 완전히 정의됩니다.
위 표에 강조한 것은 다음과 같은 방법으로 (take a look at 첫 번째 행):
예:
class Super {
public: int p;
private: int q;
protected: int r;
};
class Sub : private Super {};
class Subsub : public Sub {};
그 결과 'p', 'q', 'r' 의 클래스 변수에 대한 액세스하면 서브서브 되니그들 있다.
>, 또 다른 예를 들어:
class Super {
private: int x;
protected: int y;
public: int z;
};
class Sub : protected Super {};
그 결과 'y', 'z' 의 하위 클래스 변수에 대한 액세스하면 및 변수 (variable) 는 'x' 는 금지되었는지 없음.
>, 자세한 예:
class Super {
private:
int storage;
public:
void put(int val) { storage = val; }
int get(void) { return storage; }
};
int main(void) {
Super object;
object.put(100);
object.put(object.get());
cout << object.get() << endl;
return 0;
}
이제 하위 클래스를 정의할 수 있습니다.
class Sub : Super { };
int main(void) {
Sub object;
object.put(100);
object.put(object.get());
cout << object.get() << endl;
return 0;
}
서브노드 정의된 클래스 하위 클래스인 슈퍼 '또는' 라는 이름이 '클래스' 에서 유래한 '슈퍼' 서브노드 있는 클래스는 클래스. '클래스' 를 새로운 com/go/4e6b330a_kr disk_b_s10database 서브노드 cxp 괜찼습니다 새로운 기능ᆞ기술과. 이 모든 것은 '클래스' 는 물체의 모든 덕목 '슈퍼' 클래스 기술입니까 서브노드 상속됩니다 이후 실제 복제본입니다 '슈퍼' 클래스 '객체에는?
만약 우리가 알아야 할 것이 아니라, 다음과 같은 코드를 컴파일하십시오 컴파일 오류가 있다고 동일팔레트에 '와' '방법' 아무 것도 얻을 수 있다. 왜?
이 경우, 컴파일러는 생략하십시오 가시도로 지정자와 지금부터 우리가 소위 개인 상속 적용하십시오 가정합니다. 에 있는 모든 공공, 민간 무슨뜻이냐믄 수퍼 컴포넌트와의 액세스하면 pbs. won& # 39, 수퍼 선반가공 컴포넌트와의 전혀 액세스할 수 없다. 이에 따라 하위 클래스 내부에 있다는 이 후자의 사용할 수 없습니다.
우리는 우리가 원하는 것을 위해 사용했던 액세스만 방침이있거든 컴파일러와의
class Sub : public Super { };
>. 그러미자 방황케 하였고 : 그렇다고 이 해당 개인 요소이라고 Super >. 클래스 (스트로지 가변으로 등) 에 있는 공용 수준들과 발쿰치로 >. 다소 마법 것입니다. , Pbs. 컴포넌트와의 pbs. 남을 것이다. >. 남아 있다.
하위 클래스 객체 ',' almost" " 작업을 수행할 수 있습니다. '슈퍼' 같은 얘기를 작성한 것으로, 그들의 오래된 오빠 구분된다. 또한, 그 때문에 " Almost", , 대답하도다 of being a 클래스 전용 컴포넌트 클래스 손실됩니다 액세스하려면 수퍼 . 우리는 '의 멤버 함수를 쓸 수 없는' 스트로지 직접 조작할 수 있게 될 수 있는 하위 클래스 변수.
이건 매우 심각한 제한. 유지됩니까 해결하십시오?
세 번째 액세스만 수준 호출됨 금지되었는지 . 키워드 금지되었는지 표시된 한 때 사용되는 공용 컴포넌트, 즉 모든 하위 클래스 등 정보기술 (it) 동작 및 looks like a private 한 나머지 세계 . - 이것은 진정한 대해서만 공개적으로 상속됨 클래스 (class 예에서는 같은 슈퍼) -
class Super {
protected:
int storage;
public:
void put(int val) { storage = val; }
int get(void) { return storage; }
};
class Sub : public Super {
public:
void print(void) {cout << "storage = " << storage;}
};
int main(void) {
Sub object;
object.put(100);
object.put(object.get() + 1);
object.print();
return 0;
}
예를 들어, 우리가 보는 바와 같이 새로운 기능을 '코드' 클래스 및 않니다 서브노드 한 중요한 일은. it 액세스하며 스트로지 변수 (variable) 을 슈퍼 클래스 .
그렇지 않을 경우 가능한 것은 같이 선언된 변수는 보면안돼. 어쨌든 그래서 숨겨짐 남아 있는 주요 기능은 다음과 같은 아무것도 준비하지 않으면 유효범위 변수
object.storage = 0;
이 프로그램은 '오류 컴파일러에서 것을 알려줍니다. # 39, & # 39, int Super::storage& 보호되었음을 '.
마지막으로, 다음 출력입니다 마지막 프로그램을 만들 것이다.
storage = 101
Member in base class : Private Protected Public
Private : Inaccessible Private Private
Protected : Inaccessible Protected Protected
Public : Inaccessible Protected Public
1) 공용 상속 :
a. 파생 클래스 (base class) 의 멤버가 pbs. 액세스할 수 없습니다.
b. 파생 클래스 (base class) 의 멤버가 금지되었는지 보호됩니다.
c 클래스 (base class) 에 남아 있다.) 의 멤버여야 파생됨 했다.
따라서 다른 공용 클래스를 파생 클래스 (base class) 의 멤버여야 객체에는 통해 사용할 수 있습니다.
2) 금지되었는지 상속 :
a. 파생 클래스 (base class) 의 멤버가 pbs. 액세스할 수 없습니다.
b. 파생 클래스 (base class) 의 멤버가 금지되었는지 보호됩니다.
c 클래스 (base class) 의 멤버가 되어 있다.) 의 멤버여야 너무 금지되었는지 파생됨.
그래서, 기타, 베이스 클래스를 사용하여 클래스를 파생 클래스 객체, t # 39 의 멤버여야 can& 통해 공개 하지만 하위 파생됨 에셋을 사용할 수 있다.
3) 개인 상속 :
a. 파생 클래스 (base class) 의 멤버가 pbs. 액세스할 수 없습니다.
b. 금지되었는지 &. 파생 클래스 (base class) 의 멤버여야 pbs. 멤버가 될 것이다.
그래서 어떤 멤버가 다른 파생 클래스 (base class) 에 의해 https://learning. 통해 클래스뿐만 로케이터로 이들은 pbs. 파생 클래스. 그래서, 심지어 파생됨 의 하위 클래스
상속 모델용 is-a는 관계 있는 것이다. 함께
class B {};
class D : public B {};
모든 'D' is a 'B'.
개인 상속 모델용 오버클로킹된 사용해 구현할 수 있다. 릴레이션십 (또는 있는모든 that& # 39 의 호출됨). 함께
class B {};
class D : private B {};
하지만 모든 D 'a' 는 'B', 'D' 는 'B' 는 not 의 구현. 항상 사용하여 제거할 수 있는 개인 상속 격납형 사용하십시오.
class B {};
class D {
private:
B b_;
};
이 'D' 역시 'B', '' 이 경우 활용해 b_ 방법으로 구현할 수 있습니다. 유형 간에 커플링 (coupling) 은 더 이상 상속, 그래서 일반적으로 컨테인먼트를 꼭 갖춰야 할 기본. 가끔 컨테인먼트를 편리한 전용으로 사용하는 대신 아닌 개인 상속은 출력한다. S # 39, 게으른 that& 종종 이상한 일이 있다.
데이터 보호 할 수 있는 모든 클래스에 상속됩니다 액세스하는지 수업을 들을 수 있다. 그러나 개인 데이터 멤버를 수 없습니다. # 39 의 말하도다 let& 다음과 같습니다.
class MyClass {
private:
int myPrivateMember; // lol
protected:
int myProtectedMember;
};
Accessors | Base Class | Derived Class | World
—————————————+————————————+———————————————+———————
public | y | y | y
—————————————+————————————+———————————————+———————
protected | y | y | n
—————————————+————————————+———————————————+———————
private | | |
or | y | n | n
no accessor | | |
y: accessible
n: not accessible
[이] 기반으로 (https://stackoverflow.com/a/215505/1519058) 예 jave. 내 생각엔 좀 테이블 천 마디 말보다:)
기본 클래스의 private 멤버) 의 멤버여야 액세스하는지 이벤트여야만 수 있는 기본 클래스.
국민 기본 클래스 (base class) 의 멤버들에 의해 https://learning. 멤버가 될 수 있는 것이 아니라 그 파생 클래스 멤버 기지 밖으로 클래스 및 파생 클래스.
기본 클래스 (base class) 의 멤버들에 의해 보호 멤버는 https://learning. 뿐만 아니라 그 파생 클래스 멤버.
보면안돼 *: 기본
금지되었는지 *: 기본 + 파생됨
공공 *: 다른 멤버 파생됨 기본 + +
난 내 미래에 대해 너무 쉽게 답을 찾을 수 있는 인터넷 등 it 돌아보 참조.
해당 링크에서 http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/
class Base
{
public:
int m_nPublic; // can be accessed by anybody
private:
int m_nPrivate; // can only be accessed by Base member functions (but not derived classes)
protected:
int m_nProtected; // can be accessed by Base member functions, or derived classes.
};
class Derived: public Base
{
public:
Derived()
{
// Derived's access to Base members is not influenced by the type of inheritance used,
// so the following is always true:
m_nPublic = 1; // allowed: can access public base members from derived class
m_nPrivate = 2; // not allowed: can not access private base members from derived class
m_nProtected = 3; // allowed: can access protected base members from derived class
}
};
int main()
{
Base cBase;
cBase.m_nPublic = 1; // allowed: can access public members from outside class
cBase.m_nPrivate = 2; // not allowed: can not access private members from outside class
cBase.m_nProtected = 3; // not allowed: can not access protected members from outside class
}