Hàm tạo sao chép của lớp dẫn xuất 8.1.. Khi nào cần xây dựng hàm tạo sao chép: Khi lớp dẫn xuất có các thuộc tính kể cả thuộc tính thừa kế từ các lớp cơ sở là con trỏ, thì nhất thiết khô
Trang 1Hàm tạo sao chép của lớp dẫn xuất 8.1 Khi nào cần xây dựng hàm tạo sao chép: Khi lớp dẫn xuất có các thuộc tính (kể cả thuộc
tính thừa kế từ các lớp cơ sở) là con trỏ, thì nhất thiết không được dùng hàm tạo sao chép mặc định, mà phải xây dựng cho lớp dẫn xuất một hàm tạo sao chép
8.2 Cách xây dựng hàm tạo sao chép cho lớp dẫn xuất
+ Trước hết cần xây dựng toán tử gán cho lớp dẫn xuất (xem §7)
+ Sau đó xây dựng hàm tạo sao chép cho lớp dẫn xuất theo mẫu:
Tên_lớp_dẫn_xuất (Tên_lớp_dẫn_xuất &h )
{
*this = h ;
}
8.3 Ví dụ
Chương trình dưới đây minh hoạ cách xây dựng hàm tạo sao chép cho lớp D có 2 lớp cơ sở
là C và B (C là lớp cơ sở trực tiếp, còn B là cơ sở của C) Ngoài ra D còn có một thuộc tính là đối tượng của lớp A Chương trình này dựa trên chương trình trong mục 7.3 với 2 thay đổi: + Xây dựng thêm hàm tạo sao chép cho lớp D
+ Thay đổi một số câu lệnh trong hàm main để sử dùng hàm tạo sao chép
Để thấy rõ vai trò của hàm tạo sao chép chúng ta hãy so sánh kết quả nhận được trong 2 trường hợp: Có hàm tạo sao chép và bỏ đi hàm này
//CT5-09
// Thua ke nhieu muc
// Ham tao sao chep
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <string.h>
class A
{
private:
int a;
char *str ;
public:
A()
{
a=0; str=NULL;
}
A& operator=(A& h)
{
Trang 2this->a = h.a;
if (this->str!=NULL) delete this->str;
this->str = strdup(h.str);
return h;
}
void nhap()
{
cout << "\nNhap so nguyen lop A: " ; cin >> a ;
if (str!=NULL) delete str;
cout << "\nNhap chuoi lop A: " ;
char tg[30];
fflush(stdin); gets(tg);
str = strdup(tg);
}
void xuat()
{
cout << "\n" << "So nguyen lop A= " << a
<< " Chuoi lop A: " << str ; }
} ;
class B
{
private:
int b;
char *str ;
public:
B()
{
b=0; str=NULL;
}
B* getB()
{
return this;
}
B& operator=(B& h)
{
this->b = h.b;
if (this->str!=NULL) delete this->str;
this->str = strdup(h.str);
Trang 3return h;
}
void nhap()
{
cout << "\nNhap so nguyen lop B: " ; cin >> b ;
if (str!=NULL) delete str;
cout << "\nNhap chuoi lop B: " ;
char tg[30];
fflush(stdin); gets(tg);
str = strdup(tg);
}
void xuat()
{
cout << "\n" << "So nguyen lop B = " << b
<< " Chuoi lop B: " << str ; }
} ;
class C : public B
{
private:
int c;
char *str ;
public:
C():B()
{
c=0; str=NULL;
}
C* getC()
{
return this;
}
C& operator=(C& h)
{
B *b1, *b2;
b1= this->getB();
b2= h.getB();
*b1 = *b2;
this->c = h.c;
if (this->str!=NULL) delete this->str;
Trang 4this->str = strdup(h.str);
return h;
}
void nhap()
{
B::nhap();
cout << "\nNhap so nguyen lop C: " ; cin >> c ;
if (str!=NULL) delete str;
cout << "\nNhap chuoi lop C: " ;
char tg[30];
fflush(stdin); gets(tg);
str = strdup(tg);
}
void xuat()
{
B::xuat();
cout << "\n" << "So nguyen lop C = " << c
<< " Chuoi lop C: " << str ; }
} ;
class D : public C
{
private:
int d;
char *str ;
A u;
public:
D():C(),u()
{
d=0; str=NULL;
}
D(D& h) // Ham tao sao chep
{
*this=h;
}
D& operator=(D& h)
{
this->u = h.u;
Trang 5C *c1,*c2;
c1 = this->getC();
c2 = h.getC();
*c1 = *c2;
this->d = h.d;
if (this->str!=NULL) delete this->str;
this->str = strdup(h.str);
return h;
}
void nhap()
{
u.nhap();
C::nhap();
cout << "\nNhap so nguyen lop D: " ; cin >> d ;
if (str!=NULL) delete str;
cout << "\nNhap chuoi lop D: " ;
char tg[30];
fflush(stdin); gets(tg);
str = strdup(tg);
}
void xuat()
{
u.xuat();
C::xuat();
cout << "\n" << "So nguyen lop D = " << d
<< " Chuoi lop D: " << str ; }
} ;
void main()
{
D h1;
clrscr();
h1.nhap();
D h2(h1);
cout<<"\n\nH2:";
h2.xuat();
h1.nhap();
cout<<"\n\nH2:";
h2.xuat();
Trang 6cout<<"\n\nH1:"; h1.xuat();
getch();
}