#include <iostream>
using namespace std;
class Base {
protected: // 자식 클래스에선 접근이 가능하고 그 외에서 접근을 막음
int num;
public:
void func() {
cout << num << endl;
}
void add(int value) {
num += value;
}
};
class Derived : public Base {
public:
void foo() { // 자식 클래스에선 부모 클래스에 조건없이 접근 가능
num = 10;
add(20);
func();
}
};
int main() {
Derived d;
//d.num = 30; protect로 인해 메인함수에선 접근 불가
d.foo();
}
30
#include <iostream>
using namespace std;
class A {
};
class B0 : public A {
};
class B1 : public A {
};
class C0 : public B0 {
};
class C1 : public B0 {
};
class C2 : public B1 {
};
class C3 : public B1 {
};
/* A
B0 B1
C0 C1 C2 C3
위와 같은 트리구조로 볼 수 있음.
*/
int main() {
C0 c0;
C1 c3;
}
위 이미지를 보면 트리 구조 형식으로 상속이 이루어진 것을 알 수 있다.
#include <iostream>
using namespace std;
class Base {
private:
int num;
public:
Base() : num(0) {
cout << "Base" << endl;
}
// 자식 클래스에서 부모의 생성자를 지정을 안해주면 인수가 아무것도 없는 디폴트 생성자가 호출됨
Base(int num) : num(num) {
cout << "Base(" << num << ")" << endl;
}
virtual ~Base() { // virtual이 없다면 포인터 bp 소멸시 부모 클래스 소멸자만 호출
cout << "~Base" << endl;
}
void print() {
cout << num << endl;
}
};
class Derived : public Base {
public:
using Base::Base;
~Derived() {
cout << "~Derived" << endl;
}
};
int main() {
Derived d0(30);
Derived d1;
d0.print();
d1.print();
Base* bp = new Derived;
delete bp;
}
// 생성 될 때는 부모 -> 자식 순으로 생성
// 소멸 될 때는 자식 -> 부모 순으로 소멸
Base(30)
Base
30
0
Base
~Derived
~Base
아래는 d0, d1이 해제되는 과정임.
~Derived
~Base
~Derived
~Base