<< 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: "

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Lập trình hướng đối tượng. OpenStax CNX. Jul 29, 2009 Download for free at http://cnx.org/content/col10794/1.1
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Lập trình hướng đối tượng' conversation and receive update notifications?

Ask