상속 및 파생 클래스

상속 및 파생 클래스

형식 :

클래스 파생 클래스 이름 : 기본 클래스의 이름은 방법, 기본 클래스 상속의 이름 .... 상속

{
클래스 멤버
}

: 다양한 형태의 상속

기본 클래스의 모든 멤버가 상속을 상속를

graph LR
A类-->B
A类-->C
graph LR
A类-->B类
B类-->C类
graph LR
A类-->B类
B类-->C类
A类-->D类
D类-->C类

이 상속 : 공공, 보호, privated

. 상속 클래스가 (떨어져 기본 클래스 생성자와 소멸자에서) 그룹의 모든 구성원에 대한 기본 클래스 상속, 단지 서로 다른 접근 권한되어 있습니다 일반적으로 일 클래스의 private 멤버는 파생 클래스는 직접이 같은 모든 상속에 액세스 할 수 없습니다

  • 공공 : 대중과 파생 클래스에서 보호 기본 클래스는 여전히 공개되어 privated하지만 파생 클래스에서 privated 기본 클래스 수없는 직접 액세스 (이 개인 멤버 액세스의 기본 클래스 기능이 동작 할 수 상속)

  • 보호 : 파생 클래스에서 공공 및 보호 기본 클래스가 보호된다, 기본 클래스는 파생 클래스에서 직접 액세스 할 수 없습니다 privated

  • privated : 기본 클래스가 공개 privated와 파생 클래스에서 보호된다, 기본 클래스는 파생 클래스에서 직접 액세스 할 수 없습니다 privated

파생 클래스 :

상속 일뿐만 아니라 또한 직접 기능을 결합

클래스 타입의 호환을

클래스 타입의 호환을

#include
   
   
    
    
using namespace std;

class Base1{ //基类base1定义
public: 
    void display() const{
    cout << "Base1::display()" << endl;
    }
};

class Base2:public Base1{//共有派生类base2定义 
public:
    void display() const{
        cout << "Base2::disply()" << endl; 
    } 
};

class Derived:public Base2{
public:
    void display() const{
        cout << "Derived::display()" << endl;
    }
};

void fun(Base1 *ptr)
{
    ptr->display();
}
int main()
{
    Base1 base1;
    Base2 base2;
    Derived derived;
    fun(&base1);
    fun(&base2);
    fun(&derived);
    return 0;
}

   
   

결과 :


파생 클래스 생성자, 소멸자 및 복사 기능

생성자 (1,2UML 유형)

  1. 생성자를 작성하지 않은 경우 기본 생성자를 사용하여
  2. 파생 클래스 생성자를 생성하는 그 구조에 표시해야 할 때 인수 기본 생성자를 작성하고 기본 생성자를 작성하지 않은 경우 (나는 세부 사항을 작성하지 않음)
  3. 참고 : 기본 생성자 목록을 초기화, 당신은 객체 클래스, 기본 클래스, 파생 클래스 데이터 멤버의 기본 생성자를 초기화 할 수 있습니다,하지만 혼자 할 수있는 생성자 의뢰, 파생 클래스의 생성자를 위탁 할 수 없다
클래스의 생성자

#include
   
   
    
    
using namespace std;

class Base1 {
public:
    Base1(int i) { cout << " Constructing Base1" << endl; }
    Base1() = default;
};

class Base2 {
public:
    Base2(int j) { cout << "Constructing Base2" << endl; }
    Base2() = default;
};

class Base3 {
public:
    Base3() { cout << "Constructing Base3 *" << endl; }
};

class Derived :public Base2, public Base1, public Base3 {
public:
    Derived(int a, int b, int c, int d) :member2(d), member1(c), Base1(a), Base2(b){}
    Derived(int k) :Derived() { w = k, h = k; }
    Derived() = default;
private:
    Base1 member1;
    Base2 member2;
    Base3 memeber3;
    int w, h;
};

int main()
{
    Derived obj(1, 2, 3, 4);
    return 0;
}

   
   

우선 다음 클래스의 계승의 초기화 순서 및 객체별로 객체를 초기화하는 순서에 따라 제조, 분리의 생성자도 라인 (24)을 위임

복사 기능

  • 기본 클래스에서 상속 된 멤버는 자사의 복사 생성자는 기본 클래스 생성자를 복사하여 달성해야
  • 복사 생성자 파생 클래스는 전달 된 기본 클래스 생성자 매개 변수를 복사에 대한 책임
  • 복사 생성자 파생 클래스 하나 개의 매개 변수를 받아 들일 수,이 매개 변수는 그것은 또한 기본 클래스의 복사 생성자로 전송됩니다, 파생 클래스 정의 멤버를 초기화하는 데 사용되지 않습니다
  • 복사 생성자 파라미터 타입은 기본 클래스의 기본 클래스에 대한 참조, 인자가 유도 될 수있다 클래스 오브젝트 레퍼런스

소멸자

  • 소멸자 상속되지는 파생 클래스 선언하기 원하는 경우 자체 소멸자
  • 같은 일반적인 진술의 소멸자 방법 (아무 상속) 클래스
  • 전화 시퀀스 소멸자 반대 생성자
    • 역순 소멸자 서열로 구성된 첫 소멸자 대상 부재,
    • 그런 기본 클래스 소멸자의 실행 순서는 실행 순서가 반대 인 생성자
    • 수행 첫번째 파생 클래스의 소멸자
파생 클래스 소멸자

#include
   
   
    
    
using namespace std;
class Base1 {
public:
    Base1(int i)
    {
        cout << "Constructing Base1" << i << endl;
    }
    ~Base1() { cout << "Destructing Base1" << endl; }
};

class Base2 {
public:
    Base2(int j)
    {
        cout << "Constructing Base2" << j << endl;
    }
    ~Base2() { cout << "Destructing Base2 " << endl; }
};

class Base3 {
public:
    Base3() { cout << "Constructing Base3 *" << endl; }
    ~Base3() { cout << "Destructing Base3" << endl; }
};

class Derived :public Base2, public Base1, public Base3 {
public:
    Derived(int a, int b,int c, int d):Base1(a), member2(d), member1(c), Base2(b){}
private:
    Base1 member1;
    Base2 member2;
    Base3 member3;
};

int main()
{
    Derived obj(1, 2, 3, 4);
    return 0;
}


   
   

범위

  • 기본 클래스 (입력 파라미터의 동일 수)의 이름이 같은 파생 된 클래스의 멤버를 포함한다
  • 동일한 기능의 이름이 파생 클래스의 기본 클래스 멤버는 파생 클래스는 모호성을 생산합니다, 전화로 직접 갈 수 없어
    • 클래스 이름으로 c1.A :: F () 또는 c1.B :: F ()를 정의
    • 같은 숨겨진 이름, 파생 클래스 호출 A를 :: F에서 다시 같은 이름 기능의 구성원 () 또는 B :: f를 ()

가상 기본 클래스

이 문제를 해결하려면 파생 클래스가 공통 기본 클래스의 기본 클래스,이 공통 기본 클래스의 다음 멤버에의 액세스가 여러 기본 클래스에서 파생 된 경우, 중복 및 불일치가 발생합니다 가져 중복으로 인해 수 있습니다

가상 기본 클래스 선언 :

  • 벤큐는 가상 클래스 상속했다
  • 클래스 B1 : 가상 공공 B

가상 기본 클래스의 역할 :

  • 주로 다중 상속을 발생할 수있는 문제로부터 발생하는 같은 기본 클래스 다중 상속의 모호성을 해결하는 데 사용
  • 반복 횟수를 생산하기보다는 고유 한 기본 클래스 멤버 먼 파생 클래스를 제공합니다

참고 :

첫 번째 단계에서 공통 기본 클래스는 가상 기본 클래스를 설계 상속합니다

가상 기본 클래스 상속

#include
   
   
    
    
using namespace std;

class Base0 {
public:
    int var0;
    void fun0() { cout << "Member of Base0" << endl; }
};

class Base1 :virtual public Base0 {
public:
    int var1;
};

class Base2 :virtual public Base0 {
public:
    int var2;
};

class Derived :public Base1, public Base2 {
public:
    int var;
    void fun() {
        cout << "Member of Derived" << endl;
    }
};

int main()
{
    Derived d;
    d.var0 = 2;
    d.fun0();
    cout << &d.Base1::var0 << endl;
    cout << &d.Base2::var0 << endl;
    return 0;
}

   
   

가상 기본 클래스 생성자

  • 파생 클래스 먼라고 지정된 클래스 객체를 생성 할 때
  • 가상 기본 클래스 생성자의 멤버는 가상 기본 클래스를 초기화 생성자를 호출하여 파생 클래스에서 먼
  • 상속 계층 구조를 통해, 직접 또는 간접적으로 파생 된 클래스는 가상 기본 클래스의 모든 가상 기본 클래스 생성자의 매개 변수로 나열되어야합니다 상속 멤버 생성자의 목록을 초기화한다. 그렇지 않은 경우, 기본 생성자가 가상 ​​기본 클래스를 나타냅니다 전화
  • 객체를 생성 할 때까지만 파생 클래스 생성자가 가상 ​​기본 클래스의 생성자를 호출로, 다른 클래스는 무시됩니다 가상 기본 클래스 생성자 호출
가상 기본 클래스 생성자

#include
   
   
    
    
using namespace std;

class Base0 {
public:
    Base0(int var):var0(var){}
    int var0;
    void fun0() { cout << "Member of Base0" << endl; }
};
class Base1 :virtual public Base0 {
public:
    Base1(int var) :Base0(var) {}
    int var1;
};

class Base2 :virtual public Base0 {
public:
    Base2(int var) :Base0(var){}
    int var2;
};

class Derived :public Base1, public Base2 {
public:
    Derived(int var) :Base0(var), Base1(var), Base2(var){}
    int var;
    void fun()
    {
        cout << "Member of Derived" << endl;
    }
};

int main()
{
    Derived d(1);
    d.var0 = 2;
    d.fun0();
    return 0;
}

   
   

추천

출처www.cnblogs.com/Liberavi/p/11668019.html