상속 및 파생 클래스
형식 :
클래스 파생 클래스 이름 : 기본 클래스의 이름은 방법, 기본 클래스 상속의 이름 .... 상속
{
클래스 멤버
}
: 다양한 형태의 상속
기본 클래스의 모든 멤버가 상속을 상속를
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 유형)
- 생성자를 작성하지 않은 경우 기본 생성자를 사용하여
- 파생 클래스 생성자를 생성하는 그 구조에 표시해야 할 때 인수 기본 생성자를 작성하고 기본 생성자를 작성하지 않은 경우 (나는 세부 사항을 작성하지 않음)
- 참고 : 기본 생성자 목록을 초기화, 당신은 객체 클래스, 기본 클래스, 파생 클래스 데이터 멤버의 기본 생성자를 초기화 할 수 있습니다,하지만 혼자 할 수있는 생성자 의뢰, 파생 클래스의 생성자를 위탁 할 수 없다
클래스의 생성자
#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;
}