<< Chapter < Page | Chapter >> Page > |
Tuy nhiên, có thể sử dụng ép kiểu để chuyển đổi một con trỏ lớp cơ sở thành một con trỏ lớp dẫn xuất.
Ví dụ 5.1: Chương trình sau sẽ được chia thành nhiều file (gồm các file .H và .CPP) và tạo một project có tên là CT5_1.PRJ gồm các file .cpp
File POINT.H:
1: //POINT.H
2: //Định nghĩa lớp Point
3: #ifndef POINT_H
4: #define POINT_H
5:
6: class Point
7: {
8: protected:
9: float X,Y;
10: public:
11: Point(float A= 0, float B= 0);
12: void SetPoint(float A, float B);
13: float GetX() const
14: {
15: return X;
16: }
17: float GetY() const
18: {
19: return Y;
20: }
21: friend ostream&operator<<(ostream&Output, const Point&P);
22: };
23:
24: #endif
File POINT.CPP
1: //POINT.CPP
2: //Định nghĩa các hàm thành viên của lớp Point
3: #include<iostream.h>
4: #include "point.h"
5:
6: Point::Point(float A, float B)
7: {
8: SetPoint(A, B);
9: }
10:
11: void Point::SetPoint(float A, float B)
12: {
13: X = A;
14: Y = B;
15: }
16:
17: ostream&operator<<(ostream&Output, const Point&P)
18: {
19: Output<<'['<<P.X<<", "<<P.Y<<']';
20: return Output;
21: }
File CIRCLE.H
1: //CIRCLE.H
2: //Định nghĩa lớp Circle
3: #ifndef CIRCLE_H
4: #define CIRCLE_H
5:
6: #include "point.h"
7: class Circle : public Point
8: {
9: protected:
10: float Radius;
11: public:
12: Circle(float R = 0.0, float A = 0, float B = 0);
13: void SetRadius(float R);
14: float GetRadius() const;
15: float Area() const;
16: friend ostream&operator<<(ostream&Output, const Circle&C);
17: };
18:
19: #endif
File CIRCLE.CPP
1: //CIRCLE.CPP
2: //Định nghĩa các hàm thành viên của lớp Circle
3: #include<iostream.h>
4: #include<iomanip.h>
5: #include "circle.h"
6:
7: Circle::Circle(float R, float A, float B): Point(A, B)
8: {
9: Radius = R;
10: }
11:
12: void Circle::SetRadius(float R)
13: {
14: Radius = R;
15: }
16:
17: float Circle::GetRadius() const
18: {
19: return Radius;
20: }
21:
22: float Circle::Area() const
23: {
24: return 3.14159 * Radius * Radius;
25: }
26:
27: //Xuất một Circle theo dạng: Center = [x, y]; Radius = #.##
28: ostream&operator<<(ostream&Output, const Circle&C)
29: {
30: Output<<"Center = ["<<C.X<<", "<<C.Y
31:<<"]; Radius = "<<setiosflags(ios::showpoint)
32:<<setprecision(2)<<C.Radius;
33: return Output;
34: }
File CT5_1.CPP:
1: //CT5_1.CPP
2: //Chương trình 5.1: Ép các con trỏ lớp cơ sở tới các con trỏ lớp dẫn xuất
3: #include<iostream.h>
4: #include<iomanip.h>
5: #include "point.h"
6: #include "circle.h"
7:
8: int main()
9: {
10: Point *PointPtr, P(3.5, 5.3);
11: Circle *CirclePtr, C(2.7, 1.2, 8.9);
12: cout<<"Point P: "<<P<<endl<<"Circle C: "<<C<<endl;
13 //Xử lý một Circle như một Point (chỉ xem một phần lớp cơ sở)
14: PointPtr =&C;
15: cout<<endl<<"Circle C (via *PointPtr): "<<*PointPtr<<endl;
16 //Xử lý một Circle như một Circle
17: PointPtr =&C;
18: CirclePtr = (Circle *) PointPtr;
19: cout<<endl<<"Circle C (via *CirclePtr): "<<endl
20: <<*CirclePtr<<endl<<"Area of C (via CirclePtr): "
21: <<CirclePtr->Area()<<endl;
22: //Nguy hiểm: Xem một Point như một Circle
23: PointPtr =&P;
24: CirclePtr = (Circle *) PointPtr;
25: cout<<endl<<"Point P (via *CirclePtr): "<<endl
26: <<*CirclePtr<<endl<<"Area of object CirclePtr points to: "
Notification Switch
Would you like to follow the 'Lập trình hướng đối tượng' conversation and receive update notifications?