#include <iostream> using namespace std; class Base { public: Base() { cout << "Base" << endl; } Base(int num) : num(num) { cout << "Base(" << num << ")" << endl; } virtual ~Base() // 부모 클래스가 될 가능성이 있는 녀석들의 소멸자는 virtual을 추가해준다 { cout << "~Base" << endl; } int num; void func() { cout << num << endl; } private: int priNum; protected: int proNum; }; class Derived : public Base { public: // 생성자를 상속하고 싶은 경우 using을 이용한다. //using Base::Base; Derived() // 부모 생성자를 지정하지 않으면 부모의 디폴트 생성자를 실행해준다. { cout << "Derived" << endl; } Derived(int num) : Base(num) // 자식 생성자에서 어떤 부모 생성자를 호출할지 결정해준다 { cout << "Derived(" << num << ")" << endl; } ~Derived() { cout << "~Derieved" << endl; } void foo() { // 부모의 멤버에 접근 func(); this->func(); num += 20; func(); //this->priNum = 20; private 으로 부모에서 선언 됐기 때문에 접근 불가, 메모리에는 존재 this->proNum = 30; // protected는 자식에게 공개 됨 } void func1() {} }; void func(Base& b) {} int main() { Base b; b.num = 10; b.func(); Derived d; // 부모의 생성자가 먼저 호출 된다. d.num = 20; // 부모의 num d.func(); // 부모의 func d.foo(); //d.priNum = 20; // private으로 부모에서 선언 되어서 사용할 수 없다 //d.proNum = 30; // protected로 부모에서 선언 되어서 사용할 수 없다 // 부모 클래스는 자식 클래스를 가리킬 수 있다 Base* base = new Derived; // 자식 파괴자가 먼저 호출된다. delete base; // 부모가 자식을 가리킬 수 있기 때문에 부모 클래스를 타입으로 가지는 파라메터에 자식 객체를 넘겨줄 수 있다 func(d); } | cs |
'::public > C++' 카테고리의 다른 글
정적 결합, 동적 결합 (0) | 2020.11.27 |
---|---|
가상 함수 (0) | 2020.11.27 |
사용자 정의 리터럴 (0) | 2020.11.23 |
호출 연산자 오버로딩, 함수 객체 (0) | 2020.11.23 |
변환 연산자 오버로딩, 변환 생성자 (0) | 2020.11.23 |