C++에서 virtual 가상 함수 용법 을 깊이 이해 합 니 다.

1.virtual 수식 기본 클래스 의 함수,파생 클래스 는 이 함 수 를 다시 씁 니 다.

#include
using namespace std;
class A{
public:
 virtual void display(){ cout<<"A"<<ENDL; }
 };
class B : public A{
public:
  void display(){ cout<<"B"<<ENDL; }
 };
void doDisplay(A *p)
{
p->display();
delete p;
}
int main(int argc,char* argv[])
{
doDisplay(new B());
return 0;
}
이 코드 가 출력 된 결 과 는 B 이지 만 A 류 의 virtual 을 제거 한 후에 출력 된 것 은 A 입 니 다.
기본 클래스 에 virtual 이 없 을 때 컴 파일 러 는 컴 파일 할 때 p 를 A 류 의 대상 으로 보고 호출 하 는 것 이 자 연 스 럽 게 A 류 의 방법 이다.
그러나 virtual 을 더 한 후에 dispaly 방법 을 가상 방법 으로 바 꾸 었 다.이렇게 호출 할 때 컴 파일 러 는 호출 된 대상 이 누구의 실례 화 대상 인지 볼 수 있어 서 다 중 효 과 를 실현 했다.
즉,기 류 의 파생 류 에 기 류 를 다시 쓰 는 가상 방법 이 있 을 때 기 류 의 지침 을 사용 하여 파생 류 의 대상 을 가리 키 고 이 방법 을 사용 하면 실제 적 으로 파생 류 의 마지막 실현 방법 이 될 것 이다.
2.파생 류 virtual 계승 기본 클래스

#include
using namespace std;
class Person{
 public: Person(){ cout<<"Person  "<<ENDL; }
  ~Person(){ cout<<"Person  "<<ENDL; }
};
class Teacher : virtual public Person{
 public: Teacher(){ cout<<"Teacher  "<<ENDL; }
  ~Teacher(){ out<<"Teacher  "<<ENDL; }
};
class Student : virtual public Person{
 public: Student(){ cout<<"Student  "<<ENDL; }
  ~Student(){ cout<<"Student  "<<ENDL; }
};
class TS : public Teacher, public Student{
public:  TS(){ cout<<"TS  "<<ENDL; }
   ~TS(){ cout<<"TS  "<<ENDL; }
};
int main(int argc,char* argv[])
{
TS ts;
return 0;
}
 
1)이 코드 의 터미널 출력 결 과 는 다음 과 같다.
인격 구조
교사 구조
학생 구조
TS 구조
TS 분석 구조
학생 분석
교사 분석
인격 분석
2)Teacher 클래스 와 Student 클래스 가 Person 클래스 를 가상 으로 계승 하지 않 았 을 때 virtual 을 제거 할 때 터미널 에서 출력 한 결 과 는 다음 과 같다.
인격 구조
교사 구조
인격 구조
학생 구조
TS 구조
TS 분석 구조
학생 분석
인격 분석
교사 분석
인격 분석
여러분 은 이 결 과 를 분명히 볼 수 있 습 니 다.우리 가 기대 하 는 것 이 아 닙 니 다.
우 리 는 TS 를 구성 할 때 먼저 그의 기 류 를 구성 해 야 한다.즉,Teacher 류 와 Student 류 이다.그리고 Teacher 류 와 Student 류 는 모두 Person 류 에 계승 된다.이렇게 해서 TS 를 구성 할 때 두 Person 류 를 예화 시 켰 다.
마찬가지 로 구 조 를 분석 할 때 도 Person 류 를 두 번 분 석 했 는데 이것 은 매우 위험 하 다.또한 virtual 의 세 번 째 용법,가상 분석 구조,가상 계승 을 유도 했다.
3.허구,허구 계승

#include
using namespace std;
class Person{
 public: Person() {name = new char[16];cout<<"Person  "<<ENDL;}
 virtual ~Person() {delete []name;cout<<"Person  "<<ENDL;}
 private:
  char *name;
  };
class Teacher :virtual public Person{
public:  Teacher(){ cout<<"Teacher  "<<ENDL; }
  ~Teacher(){ cout<<"Teacher  "<<ENDL; }
};
class Student :virtual public Person{
public:  Student(){ cout<<"Student  "<<ENDL; }
  ~Student(){ cout<<"Student  "<<ENDL; }
};
class TS : public Teacher,public Student{
public:  TS(){ cout<<"TS  "<<ENDL; }
   ~TS(){ cout<<"TS  "<<ENDL; }
};
int main(int argc,char* argv[])
{
Person *p = new TS();
delete p;
return 0;
}
1)이 코드 의 실행 결 과 는 다음 과 같다.
인격 구조
교사 구조
학생 구조
TS 구조
TS 분석 구조
학생 분석
교사 분석
인격 분석
2)그러나 Person 클래스 에서 앞의 virtual 을 분석 하여 제거 한 후의 운행 결 과 는 다음 과 같다.
인격 구조
교사 구조
학생 구조
TS 구조
인격 분석
프로그램 충돌
이 결 과 는 우리 가 원 하 는 프로그램 이 아니 라 붕괴 로 인 한 결 과 는 예측 할 수 없 음 이 분명 하 므 로 기본 클래스 의 분석 함수 앞 에 virtual 을 추가 하 는 것 에 주의해 야 합 니 다.
이 를 가상 분석 구조 로 만 들 고 C+프로그램 에서 가상 함 수 를 사용 하 며 가상 계승 과 가상 분석 구 조 는 좋 은 습관 으로 많은 문 제 를 피 할 수 있다.
가상 분석 구조:
만약 하나의 클래스 가 기본 클래스 로 사용 된다 면,우 리 는 보통 가상 으로 그것 의 분석 함 수 를 수식 해 야 한 다 는 점 이 매우 중요 하 다.
기본 클래스 의 분석 함수 가 가상 분석 구조 가 아니라면 delete 로 기본 포인터(파생 클래스 의 대상 인 스 턴 스 를 가리 키 는 것)가 사용 하 는 메모리 가 있 을 때 기본 클래스 의 분석 함수 만 호출 되 고 파생 클래스 의 분석 함수 만 호출 되 지 않 습 니 다.
이것 은 메모리 유출 을 일 으 킬 수 있다.기본 클래스 의 분석 함수 가 가상 분석 구조 라면 delete 기본 클래스 포인터 일 때 계승 트 리 의 분석 함수 가 낮은 방향 에서 위로 순서대로 호출 됩 니 다.즉,최 하층 파생 류 의 분석 함수 가 먼저 호출 됩 니 다.
그리고 이 포인터 가 설명 할 때 까지 한 층 한 층 위로 올 라 갑 니 다.
가상 계승:
가상 계승 은 다 중 상속 에서 특유 한 개념 이다.가상 기 류 는 다 중 계승 을 해결 하기 위해 나타 난 것 이다.마름모꼴 계승]
예 를 들 어 류 D 는 류 B1,B2 를 계승 하고 류 B1,B2 는 모두 류 A 를 계승 하기 때문에 류 D 에서 류 A 중의 변수 와 함수 가 두 번 나타난다.
메모리 공간 을 절약 하기 위해 B1,B2 대 A 의 계승 을 가상 계승 으로 정의 할 수 있 는데 A 는 가상 기류 가 된다.실 현 된 코드 는 다음 과 같다.

class A
 
class B1:public virtual A;
 
class B2:public virtual A;
 
class D:public B1,public B2;
  
가상 계승 은 일반적인 응용 에서 거의 사용 되 지 않 기 때문에 무시 되 기도 한다.이것 은 주로 C++에서 다 중 계승 은 추천 하지 않 고 자주 사용 하지 않 기 때문이다.
다 중 상속 을 떠 나 면 가상 상속 은 존재 할 필요 성 을 완전히 잃 게 된다.효율 을 낮 추고 더 많은 공간 을 차지 하기 때문이다.
참조 링크:https://www.jb51.net/article/191365.htm
C++에서 virtual 가상 함수 용법 에 대해 깊이 있 게 알 고 있 는 이 글 은 여기까지 입 니 다.더 많은 관련 C++  virtual 가상 함수 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기