VietTuts

Tự Học Lập Trình Online

  • Home
  • Java
  • Servlet
  • JSP
  • Struts2
  • Hibernate
  • Spring
  • MyBatis
  • Java WS
  • C
  • C++
  • C#
  • Python
  • PHP
  • Excel
  • VBA
  • Web
    • JavaScript
    • JQUERY
    • JSON
    • AJAX
    • CSS
    • HTML
    • HTML5
    • Node.js
    • Angular 7
  • SQL
    • MySQL
    • SQL Server
  • Misc
    • Eclipse
    • Phần mềm tiện ích
    • Cấu trúc DL&GT
    • Selenium Test

C++ Cơ Bản

Ngôn ngữ lập trình C++ là gì? Lịch sử của C++ Các tính năng của C++ Cài đặt môi trường lập trình C++ Chương trình C++ đầu tiên Biến trong C++ Các kiểu dữ liệu trong C++ Ép kiểu trong C++ Từ khóa trong C++ Các toán tử trong C++ Comment trong C++ Các hằng số trong C++ count, cin và endl trong C++ Ký tự đặc biệt trong C++ Namespace trong C++ Template trong C++ Modifier trong C/C++

Câu Lệnh Điều Khiển C++

Mệnh đề if-else Mệnh đề switch Vòng lặp for Vòng lặp while Vòng lặp do-while Lệnh Break Lệnh Continue Lệnh Goto

C++ Function

Hàm trong C++ Hàm do người dùng định nghĩa Các kiểu hàm trong C++ Đệ quy trong C++ Call by value Call by reference

C++ Array

Mảng (array) trong C++ Mảng 2 chiều trong C++ Truyền mảng vào hàm

C++ Poiter

Con trỏ trong C++ Con trỏ Null trong C++ Con trỏ số học trong C++ Con trỏ và mảng trong C++ Mảng con trỏ trong C++ Con trỏ tới con trỏ trong C++ Truyền con trỏ tới hàm trong C++ Trả về con trỏ từ hàm trong C++

C++ Lớp Object

Khái niệm lập trình hướng đối tượng trong C++ Lớp và đối tượng trong C++ Constructor trong C++ Destructor trong C++ this trong C++ static trong C++ struct trong C++ Enumeration trong C++ Hàm Friend trong C++ Hàm Math trong C++ Tính kế thừa trong C++ Tính đa hình trong C++ Tính trừu tượng trong C++ Tính đóng gói trong C++ Interface trong C++

Nạp Chồng Toán Tử

Nạp chồng toán tử và Nạp chồng hàm trong C++ Nạp chồng toán tử một ngôi trong C++ Nạp chồng toán tử nhị phân trong C++ Nạp chồng toán tử quan hệ trong C++ Nạp chồng toán tử Input/Output trong C++ Nạp chồng toán tử ++ và -- trong C++ Nạp chồng toán tử gán trong C++ Nạp chồng toán tử gọi hàm () trong C++ Nạp chồng toán tử subscript [] trong C++ Nạp chồng toán tử truy cập thành viên lớp (->) trong C++

Lập Trình C++

Xử lý ngoại lệ trong C++ Đa luồng trong C++
Bài Tập C++ Có Lời Giải
1 / 3
❮ ❯

Tính đa hình trong C++


Tính kế thừa trong C++
Tính trừu tượng trong C++

Nội dung chính

  • Tính đa hình trong C++
  • Hàm virtual trong C++
  • Hàm pure virtual trong C++

Tính đ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;

int dt = 0;
class Hinh {
protected:
    int chieurong, chieudai;
public:
    Hinh(int a = 0, int b = 0)
    {
        chieurong = a;
        chieudai = b;
    }
     int dientich()
    {
        dt = (chieurong * chieudai);
        cout << "Dien tich cua lop cha:" << "???" << endl;
        return 0;
    }
};

class HinhChuNhat : public Hinh {
public:
    HinhChuNhat(int a = 0, int b = 0) :Hinh(a, b) { }
    int dientich()
    {
        dt = (chieurong * chieudai);
        cout << "Dien tich cua lop HinhChuNhat la: " << dt << endl;
        return 0;
    }
};

class TamGiac : public Hinh {
public:
    TamGiac(int a = 0, int b = 0) :Hinh(a, b) { }
    int dientich()
    {
        dt = (chieurong * chieudai / 2);
        cout << "Dien tich cua lop TamGiac la: " << dt << endl;
        return 0;
    }
};

// ham main cua chuong trinh
int main()
{
    Hinh* hinh;
    HinhChuNhat hcn(13, 6);
    TamGiac tg(8, 9);
    // luu giu dia chi cua HinhChuNhat
    hinh = &hcn;
    // goi dien tich cua hinh chu nhat.
    hinh->dientich();
    // luu giu dia chi cua TamGiac
    hinh = &tg;
    // goi dien tich cua tam giac.
    hinh->dientich();

    return 0;
}

Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Tính đa hình trong C++

Lý do cho output không chính xác đó là vì: lời gọi của hàm dientich() đ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 dientich() đượ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 dòng int dientich() trong lớp Hinh với từ khóa virtual, khi đó nó trông như sau:


#include <iostream> 
using namespace std;

int dt = 0;
class Hinh {
protected:
    int chieurong, chieudai;
public:
    Hinh(int a = 0, int b = 0)
    {
        chieurong = a;
        chieudai = b;
    }
    virtual int dientich()
    {
        dt = (chieurong * chieudai);
        cout << "Dien tich cua lop cha:" << "???" << endl;
        return 0;
    }
};

class HinhChuNhat : public Hinh {
public:
    HinhChuNhat(int a = 0, int b = 0) :Hinh(a, b) { }
    int dientich()
    {
        dt = (chieurong * chieudai);
        cout << "Dien tich cua lop HinhChuNhat la: " << dt << endl;
        return 0;
    }
};

class TamGiac : public Hinh {
public:
    TamGiac(int a = 0, int b = 0) :Hinh(a, b) { }
    int dientich()
    {
        dt = (chieurong * chieudai / 2);
        cout << "Dien tich cua lop TamGiac la: " << dt << endl;
        return 0;
    }
};

// ham main cua chuong trinh
int main()
{
    Hinh* hinh;
    HinhChuNhat hcn(13, 6);
    TamGiac tg(8, 9);
    // luu giu dia chi cua HinhChuNhat
    hinh = &hcn;
    // goi dien tich cua hinh chu nhat.
    hinh->dientich();
    // luu giu dia chi cua TamGiac
    hinh = &tg;
    // goi dien tich cua tam giac.
    hinh->dientich();

    return 0;
}

Sau khi sửa đổi, chạy lại chương trình C++ trên sẽ cho kết quả sau:

Tính đa hình trong C++

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 hcn và tag được lưu giữ trong *hinh, thì hàm dientich() tương ứng được gọi.

Như bạn có thể thấy, mỗi lớp con có một triển khai hàm dientich() 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à dientich() trong lớp cơ sở thành như sau:


class Hinh {
   protected:
      int chieurong, chieucao;
   public:
      Hinh( int a=0, int b=0)
      {
         chieurong = a;
         chieucao = b;
      }
      // ham pure virtual
      virtual int dientich() = 0;
};

=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 virtual function trong C++..


Tính kế thừa trong C++
Tính trừu tượng trong C++

Recent Updates

Đa luồng trong C++Xử lý ngoại lệ trong C++Nạp chồng toán tử truy cập thành viên lớp (->) trong C++Nạp chồng toán tử subscript [] trong C++Nạp chồng toán tử gọi hàm () trong C++Nạp chồng toán tử gán trong C++Nạp chồng toán tử ++ và -- trong C++Nạp chồng toán tử Input/Output trong C++Nạp chồng toán tử quan hệ trong C++Nạp chồng toán tử nhị phân trong C++Nạp chồng toán tử một ngôi trong C++Nạp chồng toán tử và Nạp chồng hàm trong C++Sắp Tết 2026 Rồi! - Còn bao nhiêu ngày nữa là đến tết 2026?

VietTuts on facebook

Học Lập Trình Online Miễn Phí - VietTuts.Vn
Danh Sách Bài Học

Học Java | Hibernate | Spring
Học Excel | Excel VBA
Học Servlet | JSP | Struts2
Học C | C++ | C#
Học Python
Học SQL

Bài Tập Có Lời Giải

Bài tập Java
Bài tập C
Bài tập C++
Bài tập C#
Bài tập Python
Ví dụ Excel VBA

Câu Hỏi Phỏng Vấn

201 câu hỏi phỏng vấn java
25 câu hỏi phỏng vấn servlet
75 câu hỏi phỏng vấn jsp
52 câu hỏi phỏng vấn Hibernate
70 câu hỏi phỏng vấn Spring
57 câu hỏi phỏng vấn SQL

Scroll back to top

Copyright © 2016 VietTuts.Vn all rights reserved. | Liên hệ | Chính sách - riêng tư | sitemap.html | sitemap_index.xml