Tải bản đầy đủ (.ppt) (56 trang)

Giáo án - Bài giảng: KỸ THUẬT THỪA KẾ TRONG C++

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (12.11 MB, 56 trang )

CHƯƠNG 5:
KỸ THUẬT THỪA KẾ

Cài đặt sự thừa kế

Sử dụng các thành phần của lớp cơ sở

Định nghĩa lại các hàm thành phần

Truyền thông tin giữa các hàm thiết lập của lớp dẫn xuất và lớp cơ sở

Các loại dẫn xuất khác nhau và sự thay đổi trạng thái của các thành phần lớp
cơ sở

Sự tương thích giữa các đối tượng của lớp dẫn xuất và lớp cơ sở

Toán từ gán và thừa kế

Hàm ảo và tính đa hình

Hàm ảo thuần tuý và lớp cơ sở trừu tượng

Đa thừa kế và các vấn đề liên quan
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. GIỚI THIỆU
-
Thừa kế cho phép ta định nghĩa một lớp mới, gọi là lớp dẫn xuất, từ một lớp đã có, gọi là lớp cơ
sở. Lớp dẫn xuất sẽ thừa kế các thành phần (dữ liệu, hàm) của lớp cơ sở, đồng thời thêm các
thành phần mới.
-


Thừa kế cho phép không cần phải biên dịch lại các thành phần chương trình vốn đã có trong các
lớp cơ sở và hơn thế nữa không cần phải có chương trình nguồn tương ứng
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. GIỚI THIỆU
Một ví dụ về sự thừa kế
Lớp: mặt hàng
Thuộc tính:
Tên
Số lượng trong kho
Giá mua
Giá bán
Các phương thức
Chênh lệch giá mua bán
Mua
Bán
Lớp: mặt hàng nhập khẩu thừa kế từ lớp mặt hàng
Thuộc tính
Thuế nhập khẩu
Các phương thức
chênh lệch giá mua bán
Lớp: xe gắn máy thừa kế từ lớp mặt hàng nhập khẩu
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. GIỚI THIỆU
Một ví dụ về sự thừa kế
Lớp: xe gắn mày thừa kế từ mặt hàng nhập khẩu
Thuộc tính:
Dung tích xilanh
Các phương thức

Lớp: hàng điện tử dân dụng thừa kế từ mặt hàng
Thuộc tính
Điện áp
Thời gian bảo hành
Các phương thức
Thời gian bảo hành thực tế
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Lớp dẫn xuất chỉ thừa kế từ một lớp cơ cở
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point {
class point {


float x,y;
float x,y;


public:
public:


point() {x = 0; y = 0;}
point() {x = 0; y = 0;}



point(float ox, float oy) {x = ox; y = oy; }
point(float ox, float oy) {x = ox; y = oy; }


point(point &p) {x = p.x; y = p.y;}
point(point &p) {x = p.x; y = p.y;}


void display() {
void display() {


cout<<"Goi ham point::display() \n";
cout<<"Goi ham point::display() \n";


cout<<"Toa do :"<<x<<" "<<y<<endl;
cout<<"Toa do :"<<x<<" "<<y<<endl;


}
}


void move(float dx, float dy) {
void move(float dx, float dy) {


x += dx;
x += dx;



y += dy;
y += dy;


}
}


};
};
class coloredpoint : public point {
class coloredpoint : public point {


unsigned int color;
unsigned int color;


public:
public:


coloredpoint():point() {
coloredpoint():point() {


color =0; }
color =0; }



coloredpoint(float ox, float oy, unsigned int
coloredpoint(float ox, float oy, unsigned int
c):point(ox,oy) {
c):point(ox,oy) {


color = c;
color = c;


}
}


coloredpoint(coloredpoint &b):point((point &)b)
coloredpoint(coloredpoint &b):point((point &)b)
{
{


color = b.color; }
color = b.color; }


void display() {
void display() {



cout<<"Ham coloredpoint::display()\n";
cout<<"Ham coloredpoint::display()\n";


point::display();
point::display();
//
//


cout<<"Mau "<<color<<endl;
cout<<"Mau "<<color<<endl;


}
}


};
};
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Lớp dẫn xuất chỉ thừa kế từ một lớp cơ cở
void main() {
void main() {


clrscr();
clrscr();



coloredpoint m;
coloredpoint m;


cout<<"Diem m \n";
cout<<"Diem m \n";


m.display();
m.display();


cout<<"Chi hien thi toa do cua m\n";
cout<<"Chi hien thi toa do cua m\n";


m.point::display();
m.point::display();




coloredpoint n(2,3,6);
coloredpoint n(2,3,6);


cout<<"Diem n \n";
cout<<"Diem n \n";



n.display();
n.display();


cout<<"Chi hien thi toa do cua n\n";
cout<<"Chi hien thi toa do cua n\n";


n.point::display();
n.point::display();


coloredpoint p =n;
coloredpoint p =n;


cout<<"Diem p \n";
cout<<"Diem p \n";


p.display();
p.display();


cout<<"Chi hien thi toa do cua p\n";
cout<<"Chi hien thi toa do cua p\n";



p.point::display();
p.point::display();


getch();
getch();


}
}
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
-
Các thành phần private trong lớp cơ sở không thể truy nhập được từ các lớp dẫn xuất
-
Lớp dẫn xuất có thể truy nhập đến thành phần protected và public của lớp cơ sở
-
Phạm vi của lớp dẫn xuất che lấp lớp cơ sở, do đó ta cần dùng toán tử phạm vi :: khi truy xuất đến
thành phần thuộc lớp cơ sở mà có đã được kế thừa lại trong lớp dẫn xuất
-
Một đối tượng của lớp dẫn xuất có thể thay thế một đối tượng của lớp cơ sở -> có việc chuyển
kiểu ngầm định từ một đối tượng thuộc lớp dẫn xuất sang một đối tượng thuộc lớp cơ sở
point p;
p.display();
coloredpointcol pc(2,3,5);
pc=p; //phù hợp
-
Một con trỏ đối tượng lớp cơ sở có thể chỉ đến một đối tượng lớp dẫn xuất, còn một con trỏ lớp
dẫn xuất không thể nhận địa chỉ của một đối tượng lớp cơ sở

CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point {
class point {


float x,y;
float x,y;


public:
public:


point() {x = 0; y = 0;}
point() {x = 0; y = 0;}


point(float ox, float oy) {x = ox; y = oy; }
point(float ox, float oy) {x = ox; y = oy; }


point(point &p) {x = p.x; y = p.y;}
point(point &p) {x = p.x; y = p.y;}



void display() {
void display() {


cout<<"Goi ham point::display() \n";
cout<<"Goi ham point::display() \n";


cout<<"Toa do :"<<x<<" "<<y<<endl;
cout<<"Toa do :"<<x<<" "<<y<<endl;


}
}


void move(float dx, float dy) {
void move(float dx, float dy) {


x += dx;
x += dx;


y += dy;
y += dy;


}

}


};
};
class coloredpoint : public point {
class coloredpoint : public point {


unsigned int color;
unsigned int color;


public:
public:


coloredpoint():point() {
coloredpoint():point() {


color =0;
color =0;


}
}


coloredpoint(float ox, float oy, unsigned int

coloredpoint(float ox, float oy, unsigned int
c):point(ox,oy) {
c):point(ox,oy) {


color = c;
color = c;


}
}


coloredpoint(coloredpoint &b):point((point
coloredpoint(coloredpoint &b):point((point
&)b) {
&)b) {


color = b.color;
color = b.color;


}
}


void display() {
void display() {



cout<<"Ham coloredpoint::display()\n";
cout<<"Ham coloredpoint::display()\n";


point::display();
point::display();
/*gäi tíi hµm cïng tªn trong
/*gäi tíi hµm cïng tªn trong
líp c¬ së*/
líp c¬ së*/


cout<<"Mau "<<color<<endl;
cout<<"Mau "<<color<<endl;


}
}


};
};
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
chú ý:
adp->display(); là point::display();
void main() {
void main() {



clrscr();
clrscr();


point *adp;
point *adp;


coloredpoint pc(2,3,5);
coloredpoint pc(2,3,5);


pc.display();
pc.display();


cout<<"adp = &pc \n";
cout<<"adp = &pc \n";


adp=&pc;
adp=&pc;


adp->move(2,3);
adp->move(2,3);



cout<<"adp->move(2,3)\n";
cout<<"adp->move(2,3)\n";


pc.display();
pc.display();


adp->display();
adp->display();


getch();
getch();


}
}
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Tương thích giữa con trỏ lớp dẫn xuất và con trỏ lớp cơ sở
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point {
class point {



float x,y;
float x,y;


public:
public:


point() {x = 0; y = 0;}
point() {x = 0; y = 0;}


point(float ox, float oy) {x = ox; y = oy; }
point(float ox, float oy) {x = ox; y = oy; }


point(point &p) {x = p.x; y = p.y;}
point(point &p) {x = p.x; y = p.y;}


void display() {
void display() {


cout<<"Goi ham point::display() \n";
cout<<"Goi ham point::display() \n";


cout<<"Toa do :"<<x<<" "<<y<<endl;
cout<<"Toa do :"<<x<<" "<<y<<endl;



}
}


void move(float dx, float dy) {
void move(float dx, float dy) {


x += dx;
x += dx;


y += dy;
y += dy;


}
}


};
};
class coloredpoint : public point {
class coloredpoint : public point {


unsigned int color;
unsigned int color;



public:
public:


coloredpoint():point() {
coloredpoint():point() {


color =0; }
color =0; }


coloredpoint(float ox, float oy, unsigned int
coloredpoint(float ox, float oy, unsigned int
c):point(ox,oy) {
c):point(ox,oy) {


color = c;
color = c;


}
}


coloredpoint(coloredpoint &b):point((point
coloredpoint(coloredpoint &b):point((point

&)b) {
&)b) {


color = b.color;
color = b.color;


}
}


void display() {
void display() {


cout<<"Ham coloredpoint::display()\n";
cout<<"Ham coloredpoint::display()\n";


point::display();
point::display();


cout<<"Mau "<<color<<endl;
cout<<"Mau "<<color<<endl;


}
}



};
};
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Tương thích giữa con trỏ lớp dẫn xuất và con trỏ lớp cơ sở
Câu lệnh adp->display(); gọi tới hàm point::display();
void main() {
void main() {


clrscr();
clrscr();


point *adp;
point *adp;


coloredpoint pc(2,3,5);
coloredpoint pc(2,3,5);


pc.display();
pc.display();


cout<<"adp = &pc \n";

cout<<"adp = &pc \n";


adp=&pc;
adp=&pc;


adp->move(2,3);
adp->move(2,3);


cout<<"adp->move(2,3)\n";
cout<<"adp->move(2,3)\n";


pc.display();
pc.display();


adp->display();
adp->display();


getch();
getch();


}
}
CHƯƠNG 5:

KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Tương thích giữa tham chiếu lớp dẫn xuất và tham chiếu lớp cơ sở
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point {
class point {


float x,y;
float x,y;


public:
public:


point() {x = 0; y = 0;}
point() {x = 0; y = 0;}


point(float ox, float oy) {x = ox; y = oy; }
point(float ox, float oy) {x = ox; y = oy; }


point(point &p) {x = p.x; y = p.y;}
point(point &p) {x = p.x; y = p.y;}



void display() {
void display() {


cout<<"Goi ham point::display() \n";
cout<<"Goi ham point::display() \n";


cout<<"Toa do :"<<x<<" "<<y<<endl;
cout<<"Toa do :"<<x<<" "<<y<<endl;


}
}


void move(float dx, float dy) {
void move(float dx, float dy) {


x += dx;
x += dx;


y += dy;
y += dy;


}

}


};
};
class coloredpoint : public point {
class coloredpoint : public point {


unsigned int color;
unsigned int color;


public:
public:


coloredpoint():point() {
coloredpoint():point() {


color =0; }
color =0; }


coloredpoint(float ox, float oy, unsigned int
coloredpoint(float ox, float oy, unsigned int
c):point(ox,oy) {
c):point(ox,oy) {



color = c; }
color = c; }


coloredpoint(coloredpoint &b):point((point
coloredpoint(coloredpoint &b):point((point
&)b) {
&)b) {


color = b.color;
color = b.color;


}
}


void display() {
void display() {


cout<<"Ham coloredpoint::display()\n";
cout<<"Ham coloredpoint::display()\n";


point::display();
point::display();



cout<<"Mau "<<color<<endl;
cout<<"Mau "<<color<<endl;


}
}


};
};
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Tương thích giữa tham chiếu lớp dẫn xuất và tham chiếu lớp cơ sở
Câu lệnh adp->display(); gọi tới hàm point::display();
void main() {
void main() {


clrscr();
clrscr();


coloredpoint pc(2,3,5);
coloredpoint pc(2,3,5);


pc.display();
pc.display();



cout<<"point &rp = pc \n";
cout<<"point &rp = pc \n";


point &rp=pc;
point &rp=pc;


rp.move(2,3);
rp.move(2,3);


cout<<"rp.move(2,3)\n";
cout<<"rp.move(2,3)\n";


pc.display();
pc.display();


rp.display();
rp.display();


getch();
getch();



}
}
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Hàm thiết lập trong lớp dẫn xuất
-
Một đối tượng trong lớp dẫn xuất có thể coi là một đối tượng thuộc lớp cơ sở, việc gọi hàm thiết
lập trong lớp dẫn xuất sẽ kéo theo việc gọi đến một hàm thiết lập trong lớp cơ sở
-
Thứ tự thực hiện của hàm thiết lập: hàm thiết lập của lớp cơ sở, hàm thiết lập của lớp dẫn xuất
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Hàm thiết lập sao chép
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point {
class point {


float x,y;
float x,y;


public:
public:



float getx() {return x;}
float getx() {return x;}


float gety() {return y;}
float gety() {return y;}


point() {x = 0; y = 0;}
point() {x = 0; y = 0;}


point(float ox, float oy) {x = ox; y = oy; }
point(float ox, float oy) {x = ox; y = oy; }


point(point &p) {x = p.x; y = p.y;}
point(point &p) {x = p.x; y = p.y;}


void display() {
void display() {


cout<<"Goi ham point::display() \n";
cout<<"Goi ham point::display() \n";


cout<<"Toa do :"<<x<<" "<<y<<endl;

cout<<"Toa do :"<<x<<" "<<y<<endl;


}
}


void move(float dx, float dy) {
void move(float dx, float dy) {


x += dx;
x += dx;


y += dy;
y += dy;


}
}


};
};
class coloredpoint : public point {
class coloredpoint : public point {


unsigned int color;

unsigned int color;


public:
public:


coloredpoint():point() {
coloredpoint():point() {


color =0;
color =0;


}
}


coloredpoint(float ox, float oy, unsigned int c);
coloredpoint(float ox, float oy, unsigned int c);


coloredpoint(coloredpoint
coloredpoint(coloredpoint
&b):point(b.getx(),b.gety()) {
&b):point(b.getx(),b.gety()) {


cout<<"Goi ham thiet lap sao chep""

cout<<"Goi ham thiet lap sao chep""


<<" coloredpoint::coloredpoint(coloredpoint
<<" coloredpoint::coloredpoint(coloredpoint
&) \n";
&) \n";


color = b.color;
color = b.color;


}
}


void display() {
void display() {


cout<<"Ham coloredpoint::display()\n";
cout<<"Ham coloredpoint::display()\n";


point::display();
point::display();


cout<<"Mau "<<color<<endl;

cout<<"Mau "<<color<<endl;


}
}


};
};
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Hàm thiết lập sao chép
coloredpoint::coloredpoint
coloredpoint::coloredpoint


(float ox, float oy, unsigned c) : point(ox, oy)
(float ox, float oy, unsigned c) : point(ox, oy)


{
{


color = c;
color = c;


}

}
void main() {
void main() {


clrscr();
clrscr();


coloredpoint pc(2,3,5);
coloredpoint pc(2,3,5);


cout<<"pc = ";
cout<<"pc = ";


pc.display();
pc.display();


cout<<"coloredpoint qc = pc;\n";
cout<<"coloredpoint qc = pc;\n";


coloredpoint qc = pc;
coloredpoint qc = pc;


cout<<"qc= ";

cout<<"qc= ";


qc.display();
qc.display();


getch();
getch();


}
}
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Các kiểu dẫn xuất khác nhau
Tứ khoá
Tứ khoá
Kiểu dẫn xuất
Kiểu dẫn xuất
public
public
Dẫn xuất public
Dẫn xuất public
private
private
Dẫn xuất private
Dẫn xuất private
protected

protected
Dẫn xuất protected
Dẫn xuất protected
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
1. ĐƠN THỪA KẾ
Dẫn xuất public
-
Trong dẫn xuất public các thành phần các hàm bạn và các đối tượng của lớp dẫn xuất không thể
truy xuất đến thành phần private của lớp cơ sở
-
Các thành phần protected trong lớp cơ sở trở thành các thành phần private trong lớp dẫn xuất
-
Các thành phần public của lớp cơ sở vẫn là public trong lớp dẫn xuất
Dẫn xuất private
-
Các thành phần public trong lớp cơ sở trở thành các thành phần private trong lớp dẫn xuất
-
Các thành phần protected trong lớp cơ sở có thể truy nhập được từ các hàm thành phần và các
hàm bạn của lớp dẫn xuất
Dẫn xuất protected
-
Các thành phần public, protected trong lớp cơ sở trở thành các thành phần protected trong lớp
dẫn xuất
CHNG 5:
K THUT THA K
1. N THA K
Lớp
cơ sở
Dẫn xuất

public
Dẫn xuất
protected
Dẫn xuất
private
TT
TN
FMA
TN
NSD
TTM TN
NSD
TTM TN
NSD
TTM TN
NSD
pub
C C
pub
C
pro
K
pri
K
pro
C K
pro
K
pro
K

pri
K
pri
C K
pri
K
pri
K
pri
K
Từ viết tắt
Diễn gii
TT
Trạng thái đầu
TTM Trạng thái mới
TN FMA Truy nhập bởi các hàm thành phần
hoặc hàm bạn.
TN NSD Truy nhập bởi ng"ời sử dụng
pro protected
pub public
pri private
C Có
K Không
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
2. VÍ DỤ
-
Xây dựng sơ đồ lớp theo đặc tả sau:
Một trường đại học có nhiều cá nhân gồm nhân viên, sinh viên. Nhân viên gồm nhân viên quản lý và
giảng viên giảng dạy. Sinh viên chia làm nhiều loại như học viên cao học, sinh viên chính qui, sinh

viên cao đẵng, tại chức. Trong trường cũng có nhiều phòng ban và các khoa. Đối với nhân viên và
cán bộ giảng dạy trường cần quản lý thông tin như mã nhân viên, tên, năm sinh, địa chỉ, hệ số
lượng, phòng hay khoa làm việc. Đối với giảng viên cần quản lý thêm thông tin về học hàm, học vị,
môn giảng dạy. Đối với nhân viên cần quản lý thông tin về chuyên môn. Đối với khoa hay phòng
ban thì quản lý tên, tên trưởng khoa/phòng, số sinh viên theo học từng loại nếu là khoa
Đối với học viên và sinh viên cần quản lý mã số, tên, năm sinh, khóa, thuộc khoa nào, địa chỉ. Đối với
học viên cao học cần quản lý thông tin chuyên ngành học đại học. Đối với học viên tại chức cần
quản lý cơ quan công tác.
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
3. HÀM ẢO VÀ TÍNH ĐA HÌNH
3.1 Giới thiệu
-
Một tham trỏ tới đối tượng có thể nhận địa chỉ của bất kỳ đối tượng con cháu nào. Tuy nhiên, lời
gọi tới một phương thức của một đối tượng được trỏ tới luôn được coi như lời gọi đến phương
thức tương ứng với kiểu con trỏ, không phải tương ứng với đối tượng đang trỏ đến. Trường hợp
này gọi là “gán kiểu tĩnh – static typing” hay “gán kiểu sớm – early binding”
-
Để gọi phương thức tương ứng với đối tượng được trỏ đến, cần phải xác định kiểu của đối tượng
tại thời điểm thực hiện chương trình. Trường hợp này ta gọi là “ gán kiểu động – dynamic typing”
hay gán kiểu muộn – late binding”
-
C++ đưa ra khái niệm hàm ảo (virtural) để giải quyết trương hợp này
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
3. HÀM ẢO VÀ TÍNH ĐA HÌNH
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>

class point {
class point {


float x,y;
float x,y;


public:
public:


point() {
point() {


cout<<"point::point()\n";
cout<<"point::point()\n";


x = 0;
x = 0;


y = 0;
y = 0;


}
}



point(float ox, float oy) {
point(float ox, float oy) {


cout<<"point::point(float, float)\n";
cout<<"point::point(float, float)\n";


x = ox;
x = ox;


y = oy;
y = oy;


}
}


point(point &p) {
point(point &p) {


cout<<"point::point(point &)\n";
cout<<"point::point(point &)\n";



x = p.x;
x = p.x;


y = p.y;
y = p.y;


}
}


virtual void display() {
virtual void display() {


cout<<"Goi ham point::display() \n";
cout<<"Goi ham point::display() \n";


cout<<"Toa do :"<<x<<" "<<y<<endl;
cout<<"Toa do :"<<x<<" "<<y<<endl;


}
}


void move(float dx, float dy) {
void move(float dx, float dy) {



x += dx;
x += dx;


y += dy;
y += dy;


}
}


};
};
class coloredpoint : public point {
class coloredpoint : public point {


unsigned int color;
unsigned int color;


public:
public:


coloredpoint():point() {
coloredpoint():point() {



cout<<"coloredpoint::coloredpoint()\n";
cout<<"coloredpoint::coloredpoint()\n";


color =0;
color =0;


}
}
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
3. HÀM ẢO VÀ TÍNH ĐA HÌNH
coloredpoint(float ox, float oy, unsigned int c);
coloredpoint(float ox, float oy, unsigned int c);


coloredpoint(coloredpoint &b):point((point &)b) {
coloredpoint(coloredpoint &b):point((point &)b) {


cout<<"coloredpoint::coloredpoint(coloredpoint
cout<<"coloredpoint::coloredpoint(coloredpoint
&)\n";
&)\n";


color = b.color;

color = b.color;


}
}


void display() {
void display() {


cout<<"Ham coloredpoint::display()\n";
cout<<"Ham coloredpoint::display()\n";


point::display();
point::display();


cout<<"Mau "<<color<<endl;
cout<<"Mau "<<color<<endl;


}
}


};
};
coloredpoint::coloredpoint(float ox, float oy,

coloredpoint::coloredpoint(float ox, float oy,
unsigned c) : point(ox, oy){
unsigned c) : point(ox, oy){


cout<<"coloredpoint::coloredpoint(float, float,
cout<<"coloredpoint::coloredpoint(float, float,
unsigned)\n";
unsigned)\n";


color = c;
color = c;


}
}
void main() {
void main() {


clrscr();
clrscr();


cout<<"coloredpoint pc(2,3,5);\n";
cout<<"coloredpoint pc(2,3,5);\n";


coloredpoint pc(2,3,5);

coloredpoint pc(2,3,5);


cout<<"pc.display();\n";
cout<<"pc.display();\n";


pc.display();
pc.display();


cout<<"point *ptr=&pc;\n";
cout<<"point *ptr=&pc;\n";


point *ptr=&pc;
point *ptr=&pc;


cout<<"ptr->display();\n";
cout<<"ptr->display();\n";


ptr->display();
ptr->display();


cout<<"point p(10,20);\n";
cout<<"point p(10,20);\n";



point p(10,20);
point p(10,20);


cout<<"ptr = &p\n";
cout<<"ptr = &p\n";


ptr = &p;
ptr = &p;


cout<<"p.display()\n";
cout<<"p.display()\n";


p.display();
p.display();


cout<<"ptr->display();\n";
cout<<"ptr->display();\n";


ptr->display();
ptr->display();


getch();

getch();


}
}
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
3. HÀM ẢO VÀ TÍNH ĐA HÌNH
-
Từ khoá virtual có thể đặt trước hay sau tên kiểu dữ liệu nhưng phải trước tên hàm để chỉ rằng là
một hàm ảo
-
Tuỳ thuộc vào kiểu của đối tượng có địa chỉ chứa trong con trỏ lớp dẫn xuất ptr mà lời gọi hàm ptr-
>display() sẽ gọi đến phương thức display() của point hay coloredpoint
CHƯƠNG 5:
KỸ THUẬT THỪA KẾ
3. HÀM ẢO VÀ TÍNH ĐA HÌNH
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point {
class point {


float x,y;
float x,y;


public:

public:


point() {
point() {


cout<<"point::point()\n";
cout<<"point::point()\n";


x = 0;
x = 0;


y = 0;
y = 0;


}
}


point(float ox, float oy) {
point(float ox, float oy) {


cout<<"point::point(float, float)\n";
cout<<"point::point(float, float)\n";



x = ox;
x = ox;


y = oy;
y = oy;


}
}


point(point &p) {
point(point &p) {


cout<<"point::point(point &)\n";
cout<<"point::point(point &)\n";


x = p.x;
x = p.x;


y = p.y;
y = p.y;


}

}
void display() ;
void display() ;


void move(float dx, float dy) {
void move(float dx, float dy) {


x += dx;
x += dx;


y += dy;
y += dy;


}
}


virtual void Identifier() {
virtual void Identifier() {


cout<<"Diem khong mau \n";
cout<<"Diem khong mau \n";


}

}


};
};
void point::display() {
void point::display() {


cout<<"Toa do : "<<x<<" "<<y<<endl;
cout<<"Toa do : "<<x<<" "<<y<<endl;


Identifier();
Identifier();


}
}

×