class Base{ // Base == Parent 클래스
std::string name;
int age;
};
class Derived1 : public Base{ // Derived==child 클래스 (파생 클래스)
int id;
};
class Derived2 : public Base{ // Derived 클래스 (파생 클래스)
int major;
};
int main(){
Derived1 s;
Derived2 p;
}
C++ : class Student : public Preson
C# : class Student : Person
Java : class Student extends Preson
Python : class Student(Person)
C++ 3개의 접근 지정자
private : 파생 클래스 멤버 함수에서는 접근 안됨 / 자신의 멤버 함수와 friend 함수에서 접근
protected : 파생 클래스 멤버 함수와 friend 함수에서 접근 가능
public
예시
class Base{
private : int a;
protected : int b;
public : int c;
};
class Derived : public Base{
public:
void df(){
a = 10;// error
b = 10;// ok
c = 20;// ok
}
};
int main(){
Derived d;
d.a = 10; // error
d.b = 10; // errir
d.c = 10; // ok
}
Base와 Derived 생성자의 경우 Base 생성자가 먼저 실행 됨
이때 Base 클래스의 디폴트 생성자를 호출한다.
class Base{
int data1;
public:
Base() : data1(0) {}
Base(int a) : data1(0) {}
~Base() {}
};
class Derived : public Base{
int data2;
public:
Derived() : data2(0) {}
Derived(int a) : data2(a) {}
~Derived(){}
}
Derived d1;
Derived d2(1); // 이렇게 선언하면 컴파일러가 Derived(1) : Base(), data2(1){}을 호출함.
// 자동으로 Base의 디폴트 생성자 호출
// 그렇기 때문에 Base에 디폴트 생성자를 만들어주지 않으면 에러가 발생
class Base{
int data1;
public:
// Base() : data1(0) {} // 이런 식으로 Base의 디폴트 생성자가 없음
Base(int a) : data1(0) {} // 얘를 호출해줘야 함.
~Base() {}
};
class Derived : public Base{
int data2;
public:
Derived() : Base(0), data2(0) {} // 이런식으로
~Derived(){}
}