상속 구조에서의 대입 연산자 호출
Programming/C++ 2012. 9. 13. 04:02 |※ 유도 클래스의 생성자에는 아무런 명시를 하지 않아도 기초 클래스의 생성자가 호출되지만,
유도 클래스의 대입 연산자에는 아무런 명시를 하지 않으면, 기초 클래스의 대입 연산자가 호출되지 않는다.
# 36행 ~ 43행: 이 대입 연산자를 정의한 것을 지워버리면 디폴트 대입 연산자가 자동으로 생성된다. 그리고는 기초클래스의 대입연산자가를 자동적으로 호출한다.
하지만, 대입 연산자를 정의할 생각이 있다면 이렇듯 기초클래스의 대입연산자를 명시적으로 호출해야 한다.
# 13행: C++ 에서는 A형 참조자는 A 객체 또는 A를 직접 혹은 간접적으로 상속하는 모든 객체를 참조할 수 있기 때문에 이렇게 가능하다.
#include <iostream>
#include <cstring>
using namespace std;
class Book
{
private:
char* title;
char* isbn;
int price;
public:
Book(char* title, char* isbn, int value)
:price(value)
{
this->title = new char[strlen(title)+1];
this->isbn = new char[strlen(isbn)+1];
strcpy(this->title, title);
strcpy(this->isbn, isbn);
}
explicit Book(const Book& ref) //복사 생성자
:price(ref.price)
{
title = new char[strlen(ref.title)+1];
isbn = new char[strlen(ref.isbn)+1];
strcpy(title, ref.title);
strcpy(isbn, ref.isbn);
}
Book& operator=(const Book& ref) //대입 연산자
{
delete []title;
delete []isbn;
price = ref.price;
title = new char[strlen(ref.title)+1];
isbn = new char[strlen(ref.isbn)+1];
strcpy(title, ref.title);
strcpy(isbn, ref.isbn);
return *this;
}
void ShowBookInfo() const
{
cout<<"제목: "<<title<<endl;
cout<<"ISBN: "<<isbn<<endl;
cout<<"가격: "<<price<<endl;
}
~Book()
{
delete []title;
delete []isbn;
}
};
class EBook :public Book
{
private:
char* DRMKey;
public:
EBook(char* title, char* isbn, int value, char* key)
:Book(title, isbn, value)
{
DRMKey = new char[strlen(key)+1];
strcpy(DRMKey, key);
}
EBook(const EBook& ref) //복사 생성자
:Book(ref) //기초클래스의 복사 생성자 호출
{
DRMKey = new char[strlen(ref.DRMKey)+1];
strcpy(DRMKey, ref.DRMKey);
}
EBook& operator=(const EBook& ref) //대입 연산자
{
delete []DRMKey;
Book::operator=(ref); //기초클래스의 대입 연산자 호출.
DRMKey = new char[strlen(ref.DRMKey)+1];
strcpy(DRMKey, ref.DRMKey);
return *this;
}
void ShowEBookInfo()
{
ShowBookInfo();
cout<<"인증키: "<<DRMKey<<endl;
}
~EBook()
{
delete []DRMKey;
}
};
int main(void)
{
Book book("zzzz", "adf2342343", 23434);
book.ShowBookInfo();
cout<<endl;
EBook ebook("asdf", "s234234", 23423, "1234ee");
ebook.ShowEBookInfo();
cout<<endl<<endl;
///////////////////////////////////////////////////////////////////
Book book1(book); //복사생성자 호출
book1.ShowBookInfo();
cout<<endl;
Book book2("thg", "234", 234221);
book1 = book2; //대입 연산자 호출
book1.ShowBookInfo();
cout<<endl;
///////////////////////////////////////////////////////////////////
EBook ebook1("asdf", "wer", 123, "qwe");
ebook1 = ebook; //대입연산자 호출 ebook1.operator=(ebook);
ebook1.ShowEBookInfo();
cout<<endl;
EBook ebook2(ebook1); //복사생성자호출 ebook2 = ebook1;
ebook2.ShowEBookInfo();
return 0;
}
'Programming > C++' 카테고리의 다른 글
배열의 인덱스 연산자 오버로딩 (0) | 2012.09.20 |
---|---|
이니셜라이저의 성능 향상에 대하여 (0) | 2012.09.20 |
디폴트 대입 연산자의 문제점 (0) | 2012.09.11 |
대입 연산자의 오버로딩2 (0) | 2012.09.10 |
cout, cin 그리고 endl의 정체 (0) | 2012.08.30 |