2021-04-23 c++ (virtual함수 소멸자)
2021. 4. 23. 12:27ㆍ카테고리 없음
#define \_CRT\_SECURE\_NO\_WARNINGS
#include <cstdio>
#include <cstring>
#include <cmath>
class Animal {//상속해주는 클래스의 멤버 변수, 함수를 외부에서도 활용할 수 있다.
public:
int legs;
char *name;
Animal(int legs, const char* name) {
this->name = new char[strlen(name) + 1];
this->legs = legs;
strcpy(this->name, name);
}
virtual ~Animal() { // virtual 함수를 사용하는 이유는 원하는 값을 찾아가기 위함이다
printf("애니멀 소멸자 호출됨\n");
delete[] name;
}
virtual void printInfo() { //속성이 따라가지 못할때는 virtual 가상함수를 사용하면 된다.
printf("다리 %d, 이름 %s\n", legs, name);
}
};
class Person : public Animal { //protected로 바꾸면 protected하게 가져온다는것
public:
char* regist_no;
Person(const char* regist_no) : Animal(2, "사람") {
this->regist_no = new char[strlen(regist_no) + 1];
strcpy(this->regist_no, regist_no);
}
virtual ~Person() { //지속&연쇄적으로 부모의 소멸자를 호출, 소멸자는 부모클래스에 virtual 작성해두더라도 필요한 곳에 다 써줘야 한다.
printf("person 소멸자 소출됨");
delete[] regist_no;
}
void printInfo() { //부모클래스가 virtual 함수일 경우 자식클래스는 virtual이 아니어도 된다. 대신 역성립은 안됨
printf("이름 %s, 주민번호 %s\n", name, regist_no);
}
};
int main() {
Animal* animal = new Person("1234-5678"); //animal타입을 만들어서 사람객체를 넣어줌
delete animal; //person 소멸자는 사용해주지 않아서 메모리 누수 일어날 수 있음
Person* person = new Person("9876-4567");
delete person; //부모의 소멸자까지 찾아가서 delete 해줌
return 0;
}
//소멸자는 위로 올라가면서 검사하는 특성이 있기 때문에 부모클래스가 없다면 바로 자신만 delete하고 끝낸다.
728x90