A sentimental robot

가상상속 본문

C++

가상상속

GOD03219 2018. 10. 1. 16:40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
using namespace std;
 
class A {
public:
    void dispA() { cout << "A::" << endl; }
};

 

 

class B : public virtual A {
public:
    void dispB() { cout << "B::" << endl; }
};

 

 

class C : public virtual A {
public:
    void dispC() { cout << "C::" << endl; }
 
};

 

 

class D : public B, public C {
 
public:
    void dispD() { cout << "D::" << endl; }
 
};

 

 

int main() {
 
    D dd;
    dd.dispD();
    dd.dispB();
    dd.dispC();
 
    //dd.dispA(); B,C클래스 중 누가 상속받는 dispA()인지 모름: 가상상속을 해준다.
    dd.dispA(); // B,C 클래스가 A 클래스를 가상 상속 받음으로써 내부적으로 D도 A을 상속받는 형태가 된다.
 
}
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<iostream>
using namespace std;
 
class A {
 
    int a;
 
public:
    A() { }
    A(int a) { this->= a; }
 
    void dispA() { cout << "A::" << a << endl; }
};
class B : virtual public  A {
 
    int a;
 
public:
    B(int a) {
 
        this->= a;
 
    }
    void dispB() { cout << "B::" << a << endl; }
};
class C : public virtual A {
 
    int  a;
 
public:
    C(int a) {
 
        this->= a;
 
    }
    void dispC() { cout << "C::" << a << endl; }
 
};
class D : public B, public C {
 
    int a;
public:
 
    D(int a, int b, int c, int d) : A(a), B(b), C(c) {
 
        this->= d;
 
    }
 
    void dispD() { cout << "D::" << a << endl; }
 
};
int main() {
 
    D dd(1234);
 
    dd.dispD();
    dd.dispC();
    dd.dispB();
    dd.dispA();
 
}
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<iostream>
using namespace std;
 
class A {
 
    int a; // 1
public:
    
    A(int a) {
        this->= a;
    }
    void dispA() { cout << "A::" << a << endl; }
};

 

 

 

class B : virtual public  A {
 
    int a; //2
public:
    B(int a, int b) : A(a) {
 
        this->= b;
 
    }
    void dispB() { cout << "B::" << a << endl; }
};

 

 

class C : public virtual A {
 
    int  a;//3
 
public:
    C(int a, int c) :A(a) {
 
        this->= c;
 
    }
    void dispC() { cout << "C::" << a << endl; }
 
};

 

 

class D : public B, public C {
 
    int a; //4
public:
 
    D(int a, int b, int c, int d) : A(a), B(a, b), C(a, c) {
 // 가상 상속을 했기 때문에 A생성자에도 값을 줘야함
        this->= d;
 
    }
 
    void dispD() { cout << "D::" << a << endl; }
 
};

 

 

int main() {
 
    D dd(1234);
 
    dd.dispD();
    dd.dispC();
    dd.dispB();
    dd.dispA();
 
}
cs

'C++ ' 카테고리의 다른 글

virtual function  (0) 2018.10.01
상속  (0) 2018.10.01
연산자함수 오버로딩 예제  (0) 2018.09.21
iostream operator function overloading  (0) 2018.09.20
대입연산자  (0) 2018.09.19