C++에서 virtual 의 세 가지 용법 에 대해 논 하 다.

4907 단어 C++virtual
virtual 용법 1

#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 방법 을 가상 방법 으로 바 꾸 었 다.이렇게 호출 할 때 컴 파일 러 는 호출 된 대상 이 누구의 실례 화 대상 인지 볼 수 있어 서 다 중 효 과 를 실현 했다.즉,기 류 의 파생 류 에 기 류 를 다시 쓰 는 가상 방법 이 있 을 때 기 류 의 지침 을 사용 하여 파생 류 의 대상 을 가리 키 고 이 방법 을 사용 하면 실제 적 으로 파생 류 의 마지막 실현 방법 이 될 것 이다.
virtual 용법 2

#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;
}
이 코드 의 터미널 출력 결 과 는 다음 과 같 습 니 다.
인격 구조
교사 구조
학생 구조
TS 구조
TS 분석 구조
학생 분석
교사 분석
인격 분석
Teacher 클래스 와 Student 클래스 가 Person 클래스 를 가상 으로 계승 하지 않 았 을 때 virtual 을 제거 할 때 터미널 출력 결 과 는 다음 과 같 습 니 다.
인격 구조
교사 구조
인격 구조
학생 구조
TS 구조
TS 분석 구조
학생 분석
인격 분석
교사 분석
인격 분석
이 결 과 는 우리 가 기대 하 는 것 이 아니 라 는 것 을 잘 알 수 있 습 니 다.우 리 는 TS 를 구성 할 때 먼저 그의 기 류 를 구성 해 야 한다.즉,Teacher 류 와 Student 류 이다.그리고 Teacher 류 와 Student 류 는 모두 Person 류 에 계승 된다.이렇게 해서 TS 를 구성 할 때 두 Person 류 를 예화 시 켰 다.마찬가지 로 구 조 를 분석 할 때 도 Person 류 를 두 번 분 석 했 는데 이것 은 매우 위험 하 다.또한 virtual 의 세 번 째 용법,가상 분석 구조,가상 계승 을 유도 했다.
virtual 용법 3

#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;
}
이 코드 의 실행 결 과 는 다음 과 같 습 니 다.
인격 구조
교사 구조
학생 구조
TS 구조
TS 분석 구조
학생 분석
교사 분석
인격 분석
그러나 우리 가 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++에서 다 중 계승 은 추천 하지 않 고 자주 사용 하지 않 기 때문이다.그러나 다 중 계승 을 떠 나 면 가상 계승 은 존재 할 필요 성 을 완전히 잃 게 된다.그러면 효율 을 낮 추고 더 많은 공간 을 차지 할 수 있 기 때문이다.
C++에서 virtual 의 세 가지 용법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C++virtual 용법 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기