C++다 중 계승 으로 인 한 중복 호출 문제 와 해결 방법

3759 단어 C++다 중 상속
본 고 는 C++다 중 계승 으로 인 한 중복 호출 문제 와 해결 방법 을 실례 로 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
앞에서 간단하게 C++다 중 계승 기능 예 시 를 소개 했다.여기 서 다 중 계승 으로 인 한 중복 호출 문 제 를 분석 하고 먼저 문제 코드 를 살 펴 보 자.

#include "stdafx.h"
#include<stdlib.h>
#include<iostream>
using namespace std;
class R//   
{
private:
  int r;
public:
  R(int x = 0):r(x){}
  void f()
  {
    cout << " r = " << r << endl;
  }
  void print()
  {
    cout << "print R = " << r << endl;
  }
};
//   
class A : virtual public R
{
private:
  int a;
public:
  A(int x,int y):R(x),a(y){}
  //     f()  
  void f()
  {
    cout << "a = " << a << endl;
    R::f();//r       ,      ,                  f()
  }
};
//   
class B : virtual public R
{
private:
  int b;
public:
  B(int x, int y) :R(x), b(y) {}
  //     f()  
  void f()
  {
    cout << "b = " << b << endl;
    R::f();//r       ,      ,                  f()
  }
};
class C :public A, public B
{
private:
  int c;
public:
  C(int x,int y,int z,int m):R(x),A(x,y),B(x,z),c(m)
  { }
  void f()
  {
    cout << "c = " << c << endl;
    A::f();//  A      r    ,   a
    B::f();//B      r   ,   b
    //        ,     r
  }
};
int main()
{
  C cc(1212, 345, 123, 45);
  cc.f();
  system("pause");
  return 0;
}

해결 방법:중복 호출 에 대하 여 각 종 류 는 자신 만 의 일 을 단독으로 밀봉 합 니 다.
수 정 된 코드 는 다음 과 같 습 니 다.

#include "stdafx.h"
#include<stdlib.h>
#include<iostream>
using namespace std;
class R//   
{
private:
  int r;
public:
  R(int x = 0):r(x){}
  void f()
  { cout << " r = " << r << endl;    }
  virtual void print()
  { cout << "print R = " << r << endl;}
};
//   
class A : virtual public R//virtual  public      
{
private:
  int a;
public:
  A(int x,int y):R(x),a(y){ }
protected:
  void fA()//        ,          
  {
    cout << "a = " << a << endl;
  }
  void f()//     f()  
  {
    //cout << "a = " << a << endl;
    fA();
    R::f();//r       ,      ,                  f()
  }
};
//   
class B : virtual public R
{
private:
  int b;
public:
  B(int x, int y) :R(x), b(y) {}
protected:
  void fB()//        ,          
  {
    cout << "b = " << b << endl;
  }
  void f()//     f()  
  {
    fB();
    R::f();//r       ,      ,                  f()
  }
};
class C :public A, public B
{
private:
  int c;
public:
  C(int x,int y,int z,int m):R(x),A(x,y),B(x,z),c(m)
  { }
  void f()
  {
    cout << "c = " << c << endl;
    R::f();
    //A::f();//  A      r    ,   a
    //B::f();//B      r   ,   b
    //        ,     r
    fA();//A::fA();
    fB();//A::fB();
  }
};
int main()
{
  C cc(1212, 345, 123, 45);
  cc.f();
  system("pause");
  return 0;
}

본 논문 에서 말 한 것 이 여러분 의 C+프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기