C++다 중 계승 2 의성 원리 실례 분석

파생 류 에서 기본 멤버 에 대한 방문 은 유일 해 야 하지만 다 중 상속 시 기본 멤버 에 대한 방문 이 일치 하지 않 을 수 있 습 니 다.이것 이 바로 C+다 중 상속 중의 이의 성 입 니 다.
두 가지 상속 이 있 으 면 다 의성 이 생 긴 다.
1.만약 에 하나의 파생 류 가 여러 개의 기본 클래스 에서 파생 되 고 이런 기본 클래스 가 하나의 공 통 된 기본 클래스 가 있다 면 이 기본 클래스 에서 설명 한 구성원 변 수 를 방문 할 때 이의 성 이 생 길 수 있 습 니 다.계승 관 계 는 다음 그림 과 같 습 니 다.

#include <iostream>
using namespace std;
 
class A{
public:
  int a;
};
 
class B1 : public A{
public:
  int b1;
};
 
class B2 : public A{
public:
  int b2;
};
 
class C : public B1, public B2{
public:
  int c;
};
int main(){
  C c1;
  c1.b1 = 100;
  c1.b2 = 200;
  c1.c = 300;
 
  c1.a = 500; //  ,        a      
 
  cout << "end..." << endl;
  system("pause");
  return 0;
}
해결 방법:가상 계승
메모:C+컴 파일 시스템 은 C 클래스 를 예화 할 때 가상 클래스 A 의 구조 함수 만 한 번 호출 하고 가상 클래스 의 다른 파생 클래스(class B1,class B2)가 가상 계승 구조 함수 에 대한 호출 을 무시 하여 가상 클래스 의 데이터 구성원 이 여러 번 초기 화 되 지 않도록 합 니 다.
가상 기본 클래스 A 에 가상 포인터 가 가상 표를 가리 키 고 있 습 니 다.가상 표 에는 가상 기본 클래스 와 이 유형의 주소 오프셋 이 기록 되 어 있 습 니 다.이 주소 오프셋 을 통 해 가상 기본 클래스 의 구성원 변수 a 의 주 소 를 찾 을 수 있 습 니 다.

#include <iostream>
using namespace std;
 
class A{
public:
  int a;
};
 
class B1 : virtual public A{
public:
  int b1;
};
 
class B2 : virtual public A{
public:
  int b2;
};
 
class C : public B1, public B2{
public:
  int c1;
};
 
int main(){
  C c1;
  c1.b1 = 100;
  c1.b2 = 200;
  c1.c1 = 300;
 
  c1.a = 500; //         a      ,           
 
  cout << "end..." << endl;
  system("pause");
  return 0;
}
2.하나의 파생 류 는 두 개의 기 류 를 동시에 계승 하 는데 이 두 기 류 는 똑 같은 구성원 함수 가 존재 한다.

#include<iostream>
using namespace std;
 
 
class Base1 {
public:
  void fun() {
    cout << "I am base-1 " << endl;
  };
};
 
class Base2
{
public:
  void fun() {
    cout << "I am base-2 " << endl;
  };
};
 
class A: public Base1, public Base2 {
public:
  void print() {
  }
};
 
int main() {
  A obj;
  obj.fun();  //         
  system("pause");
  return 0;
}
해결 방법:역할 영역 연산 자 를 사용 합 니 다:해결,명확 한 지향 방법,예 를 들 어 obj.Base 1:fun()
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기