1. Trang chủ
  2. » Thể loại khác

Đa hình trong C++ | 101 bài hướng dẫn C++ hay nhất PDF

5 149 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 348,9 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Tiêu biểu là, đa hình xuất hiện khi có một cấu trúc cấp bậc của các lớp và chúng là liên quan với nhau bởi tính kế thừa.. Đa hình trong C++ nghĩa là một lời gọi tới một hàm thành viên s

Trang 1

Đa hình trong C++

Đa hình (polymorphism) nghĩa là có nhiều hình thái khác nhau Tiêu biểu là, đa hình xuất hiện khi

có một cấu trúc cấp bậc của các lớp và chúng là liên quan với nhau bởi tính kế thừa

Đa hình trong C++ nghĩa là một lời gọi tới một hàm thành viên sẽ làm cho một hàm khác để được thực thi phụ thuộc vào kiểu của đối tượng mà triệu hồi hàm đó

Bạn xem xét ví dụ sau, ở đây lớp cơ sở đã được kế thừa bới hai lớp khác trong C++:

#include <iostream>

using namespace std;

class Shape

protected:

int width, height;

public:

Shape ( int a= , int b= )

{

width = a;

height = b;

}

int area()

{

cout << "Parent class area :" <<endl;

return ;

}

};

class Rectangle : public Shape {

public:

Rectangle ( int a= , int b= ): Shape ( , b) { }

int area ()

{

cout << "Rectangle class area :" <<endl;

return width * height);

Trang 2

}

};

class Triangle : public Shape {

public:

Triangle ( int a= , int b= ): Shape ( , b) { }

int area ()

{

cout << "Triangle class area :" <<endl;

return width * height / 2 );

}

};

// Main function for the program

int main( )

{

Shape shape;

Rectangle rec( 10 , );

Triangle tri( 10 , );

// store the address of Rectangle

shape = &rec;

// call rectangle area

shape->area();

// store the address of Triangle

shape = &tri;

// call triangle area

shape->area();

return ;

}

Khi code trên được biên dịch và thực thi, nó cho kết quả sau:

Trang 3

Parent class area

Lý do cho output không chính xác đó là vì: lời gọi của hàm area() đang được thiết lập một lần bởi

compiler như phiên bản được định nghĩa trong lớp cơ sở đó Điều này gọi là static resolution (sự phân giải tĩnh) của lời gọi hàm, hoặc static linkage (sự liên hợp tĩnh) – lời gọi hàm được sửa trước khi chương trình được thực thi Đôi khi nó cũng được gọi là early binding (hoặc static binding) bởi vì hàm area() được thiết lập trong khi biên dịch chương trình

Bây giờ, chúng ta sửa chương trình trên một chút và đặt trước khai báo của area() trong lớp Shape

với từ khóa virtual, khi đó nó trông như sau:

class Shape

protected:

int width, height;

public:

Shape ( int a= , int b= )

{

width = a;

height = b;

}

virtual int area()

{

cout << "Parent class area :" <<endl;

return ;

}

};

Sau khi sửa đổi, khi code của ví dụ trên được biên dịch và thực thi, nó sẽ cho kết quả sau:

Rectangle class area

Triangle class area

Lúc này, compiler nhìn vào các nội dung của con trỏ thay vì kiểu của nó Vì thế, khi địa chỉ của các đối tượng của lớp tri và rec được lưu giữ trong *shape, thì hàm area() tương ứng được gọi

Trang 4

Như bạn có thể thấy, mỗi lớp con có một triển khai hàm area() riêng biệt Đây là cách chung mà Đa hình trong C++ được sử dụng Bạn có các lớp khác nhau với cùng một tên hàm, và có thể là cùng tham số, nhưng trình triển khai là khác nhau

Hàm virtual trong C++

Một hàm virtual là một hàm trong một lớp cơ sở mà được khai báo bởi sử dụng từ khóa virtual

trong C++ Việc định nghĩa trong một lớp cơ sở một hàm virtual, với phiên bản khác trong một lớp

kế thừa, báo cho compiler rằng: chúng ta không muốn Static Linkage cho hàm này

Những gì chúng ta làm là muốn việc lựa chon hàm để được gọi tại bất kỳ điểm nào đã cung cấp trong chương trình là dựa trên kiểu đối tượng, mà với đó nó được gọi Hoạt động này có thể gọi tắt

là dynamic linkage, hoặc late binding trong C++

Hàm pure virtual trong C++

Nó là có thể nếu bạn muốn bao một hàm virtual trong một lớp cơ sở, để mà nó có thể được tái định nghĩa trong một lớp kế thừa để phù hợp với các đối tượng của lớp đó, nhưng đó là định nghĩa không có ý nghĩa gì

Chúng ta có thể thay đổi hàm virtual là area() trong lớp cơ sở thành như sau:

class Shape

protected:

int width, height;

public:

Shape ( int a= , int b= )

{

width = a;

height = b;

}

// pure virtual function

virtual int area() ;

};

=0 nói cho compiler rằng hàm đó không có phần thân và hàm virtual trên sẽ được gọi là hàm pure

Ngày đăng: 02/12/2017, 14:01

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm