집 >백엔드 개발 >C#.Net 튜토리얼 >[C++] 상속에 대한 기본 지식과 접근 한정자와의 관계에 대한 심층적인 이해
상속 메서드와 액세스 한정자의 관계
세 가지 상속 메서드:
공개 상속
개인 상속
보호 상속
관계: 기본 클래스의 멤버 함수 비공개입니다 , 그러면 파생 클래스는 기본 클래스의 전용 멤버에게 표시되지 않으며 다른 기준은 작은 범위를 선택하고 최종 액세스를 제한하는 것입니다.
Protected 멤버 한정자: 일부 기본 클래스 멤버는 기본 클래스의 개체에서 직접 액세스하기를 원하지 않지만 파생 클래스에서 액세스해야 하며 보호 멤버로 정의됩니다. 보호된 멤버 한정자는 상속으로 인해 발생합니다.
숨기기 이해
숨김은 파생 클래스의 함수가 동일한 이름을 가진 기본 클래스 함수를 차단한다는 의미입니다. 규칙은 다음과 같습니다.
파생 클래스의 함수가 기본 클래스의 함수와 이름은 동일하지만 매개변수가 다른 경우, 이때 기본 클래스의 함수는 관계없이 숨겨집니다. 가상 키워드.
파생 클래스의 함수가 기본 클래스의 함수와 이름이 같고 매개변수도 동일하지만 기본 클래스 함수에 virtual 키워드가 없는 경우 이때의 함수는 기본 클래스는 숨겨져 있습니다.
파생 클래스의 기본 멤버 함수
6개의 기본 멤버 함수가 파생 클래스에 명시적으로 정의되지 않은 경우 컴파일 시스템은 기본적으로 이러한 6개의 멤버 함수를 합성합니다.
Constructor
복사 생성자
Destructor
할당 연산자 오버로드
주소 연산자 오버로딩 가져오기
const 수정된 주소 가져오기 연산자 오버로딩
#include<iostream> using namespace std; class person{ public: person(const char* name) :_name(name) { cout<<"person()"<<endl; } person(const person& p){ cout<<"person(const person& p)"<<endl; } person& operator=(const person& p){ cout<<"person& operator=(const person& p)"<<endl; if(this!=&p){ _name=p._name; } return *this; } ~person(){ cout<<"~person()"<<endl; } protected: string _name; }; class student:public person{ public: student(const char* name,int num) :person(name) ,_num(num){ cout<<"student()"<<endl; } student(const student& s) :person(s) ,_num(s._num) { cout<<"student(const student& s)"<<endl; } student& operator=(const student& s){ cout<<"student& operator=(const student& p)"<<endl; if(this!=&s){ person::operator=(s);//必须指定域,否则会死循环 _num=s._num; } return *this; } ~student(){//析构的时候先清理子类,再清理父类,不需要显示的调用 cout<<"~student()"<<endl; } private: int _num; }; int main(){ student s1("jack",18); student s2(s1); student s3("rose",16); s1=s3; }
다이아몬드 상속
다이아몬드 상속에는 모호성과 데이터 중복 문제가 있습니다.
예, 아래 그림의 상속된 데이터는 각각 다른 두 개의 복사본입니다.
해결책: 가상 상속
다이아몬드의 두 번째 레이어에 가상 추가
예:
관련 기사:
관련 동영상:
위 내용은 [C++] 상속에 대한 기본 지식과 접근 한정자와의 관계에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!