Hiển thị các bài đăng có nhãn Học lập trình. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Học lập trình. Hiển thị tất cả bài đăng

NotebookLM cho sinh viên: hướng dẫn dùng từ A đến Z

Đến mùa thi, trong máy bạn thường có một mớ hỗn độn: slide bài giảng, giáo trình PDF mấy trăm trang, ảnh chụp bảng, vài video YouTube giảng lại bài. Đọc hết thì không đủ thời gian, bỏ qua thì sợ trúng tủ ngược. NotebookLM cho sinh viên là một cách giải quyết khá gọn: bạn nạp đúng những tài liệu của môn học vào, rồi hỏi gì nó trả lời nấy, kèm trích dẫn chỉ thẳng về trang nào trong tài liệu. Bài này mình hướng dẫn bạn cách dùng từ bước đăng nhập, cách nạp tài liệu, các tính năng đáng giá nhất khi ôn thi, và cả những giới hạn bạn nên biết trước.

NotebookLM cho sinh viên: hướng dẫn dùng từ A đến Z


1. NotebookLM là gì?

NotebookLM là trợ lý nghiên cứu chạy bằng AI của Google, giúp bạn sắp xếp và khai thác chính những tài liệu mình tải lên. Từ năm 2026, Google đổi tên hiển thị của sản phẩm thành Gemini Notebook và chuyển trang chính sang notebook.google.com, nhưng cái tên NotebookLM vẫn được dùng rộng rãi.

Theo trang trợ giúp chính thức của Google, công cụ này cho phép bạn tải lên PDF, trang web, video YouTube, file âm thanh, Google Docs hay Google Slides, rồi trò chuyện với chúng và nhận câu trả lời có trích dẫn nội tuyến. Công cụ hỗ trợ hơn 80 ngôn ngữ, trong đó có tiếng Việt, và chỉ cần một tài khoản Google là dùng được.

2. Hoạt động như thế nào?

Hãy hình dung mỗi "notebook" là một chiếc cặp tài liệu của một môn học. Bạn bỏ vào đó giáo trình, slide, đề cương, bài báo. AI chỉ được phép đọc những thứ trong chiếc cặp ấy để trả lời bạn.

Đây là khác biệt lớn so với các chatbot thông thường. Nếu câu trả lời không nằm trong tài liệu, Google cho biết công cụ sẽ nói thẳng là không có thông tin, thay vì tự bịa ra. Mỗi câu trả lời cũng kèm số trích dẫn, bấm vào là nhảy thẳng tới đoạn gốc để bạn tự kiểm chứng.

3. Vì sao sinh viên nên dùng?

Tiết kiệm thời gian đọc. Thay vì lật 300 trang giáo trình tìm một định nghĩa, bạn hỏi thẳng và nhận câu trả lời kèm vị trí trang.

Giảm rủi ro AI nói sai. Vì câu trả lời bám vào tài liệu của trường và có trích dẫn, bạn dễ phát hiện chỗ nào đáng ngờ. Điều này quan trọng khi bạn viết tiểu luận hoặc đồ án và phải chịu trách nhiệm về nguồn.

Biến tài liệu khô khan thành dạng dễ học. Một bộ slide có thể trở thành sơ đồ tư duy, bộ thẻ ghi nhớ, bài trắc nghiệm hoặc một đoạn podcast để nghe trên đường đi học.

4. Hướng dẫn sử dụng theo 5 bước

  1. Đăng nhập: mở notebook.google.com và đăng nhập bằng tài khoản Google cá nhân hoặc tài khoản trường cấp. Nếu dùng tài khoản trường mà không vào được, quản trị viên của trường cần bật quyền truy cập.
  2. Tạo notebook mới: mỗi môn học một notebook riêng. Đặt tên rõ ràng, ví dụ "Cấu trúc dữ liệu – HK1".
  3. Thêm nguồn: bấm Add sources rồi tải file lên, dán link web, chọn file từ Google Drive hoặc dán thẳng đoạn văn bản. Google cho biết công cụ nhận PDF, Word (.docx), .txt, Markdown, CSV, PowerPoint (.pptx), ePub, ảnh, file âm thanh, Google Docs, Google Slides (tối đa 100 slide), Google Sheets, link web và link YouTube công khai.
  4. Đặt câu hỏi: gõ câu hỏi vào khung chat ở giữa. Hỏi càng cụ thể càng tốt. Khi notebook có nhiều nguồn, nên nhắc tên tài liệu trong câu hỏi để AI khoanh vùng đúng chỗ.
  5. Tạo tài liệu ôn tập: mở khung Studio bên phải và chọn thứ bạn cần: bản tóm tắt dạng âm thanh, video tóm tắt, sơ đồ tư duy, thẻ ghi nhớ, bài trắc nghiệm, infographic hay slide.

5. Những tính năng đáng dùng nhất khi học

  • Trích dẫn nội tuyến: mỗi ý trong câu trả lời đều có đường dẫn về đoạn gốc. Dùng để kiểm tra trước khi đưa vào tiểu luận.
  • Sơ đồ tư duy (Mind Map): dựng nhanh cấu trúc một chương để nhìn ra mạch kiến thức trước khi học chi tiết.
  • Thẻ ghi nhớ và trắc nghiệm: theo tài liệu của Google, bạn có thể chọn độ khó dễ – trung bình – khó, đánh dấu thẻ đã thuộc hoặc chưa thuộc, và công cụ nhớ tiến độ để lần sau học tiếp. Bộ thẻ còn tải về được dưới dạng file CSV.
  • Audio Overview: biến tài liệu thành một đoạn trò chuyện kiểu podcast, hợp để nghe lại khi di chuyển.
  • Tìm nguồn ngay trong ứng dụng: gõ một câu hỏi nghiên cứu vào ô tìm kiếm ở khung nguồn, công cụ sẽ gợi ý tài liệu từ web hoặc từ Google Drive của bạn để thêm vào notebook. Riêng chế độ Deep Research chỉ mở cho người dùng trên 18 tuổi.

Xem thêm: Giáo trình mới dành cho sinh viên CNTT và bộ tài liệu Ebook IT chia sẻ qua Google Drive để có sẵn nguồn nạp vào notebook.

6. Mẹo dùng hiệu quả hơn

  • Mỗi môn một notebook: gom tất cả vào một chỗ sẽ khiến câu trả lời bị loãng và dễ lẫn kiến thức giữa các môn.
  • Tắt bớt nguồn khi hỏi: trong khung Sources, chỉ chọn vài tài liệu liên quan tới câu hỏi để AI tập trung đúng phạm vi.
  • Nhập tài liệu từ Google Drive: nguồn lấy từ Drive được đồng bộ tự động vài phút một lần, nên khi thầy cô sửa file, notebook của bạn cũng cập nhật theo. File tải lên từ máy thì phải xóa và tải lại thủ công.
  • Hỏi theo định dạng: yêu cầu rõ "trả lời dạng bảng", "liệt kê 5 ý", "giải thích như cho người mới" sẽ cho kết quả dễ dùng hơn nhiều so với câu hỏi chung chung.
  • Biến ghi chú thành nguồn: sau khi tạo một bản tóm tắt ưng ý, bạn có thể chuyển nó thành nguồn mới để hỏi sâu thêm ở vòng sau.

Đọc thêm nhiều bài hướng dẫn khác trong chuyên mục Bài viết hay của blog.

7. Một vài lưu ý thật lòng

Có giới hạn dung lượng. Google quy định mỗi nguồn tối đa 500.000 từ hoặc 200 MB với file tải lên, và tài khoản miễn phí được tối đa 50 nguồn trong một notebook (số liệu tra ngày 14/10/2026). Với một môn học bình thường thì con số này rất thoải mái.

Có giới hạn lượt dùng. Từ năm 2026 Google áp dụng hạn mức tính theo mức tiêu tốn tài nguyên: câu hỏi càng dài, tính năng càng nặng thì càng tốn. Hạn mức làm mới sau mỗi 5 giờ cho tới khi chạm trần theo tuần. Bản miễn phí dùng mức tiêu chuẩn, các gói trả phí được mức cao hơn.

Video YouTube không phải lúc nào cũng nạp được. Chỉ video công khai và có phụ đề mới dùng làm nguồn, và công cụ chỉ lấy phần lời thoại dạng văn bản chứ không xem hình.

AI vẫn có thể sai. Google nói rõ công cụ có thể mắc lỗi. Bám vào nguồn không có nghĩa là hiểu đúng nguồn, nên bạn vẫn phải bấm vào trích dẫn để đối chiếu, nhất là với công thức và định nghĩa.

Cẩn thận với tài liệu nhạy cảm và bản quyền. Google khuyên không tải lên tài liệu bạn không có quyền sử dụng. Dữ liệu của bạn không được dùng để huấn luyện mô hình trừ khi bạn chủ động gửi phản hồi, nhưng với đồ án chứa thông tin cá nhân hay dữ liệu doanh nghiệp, bạn vẫn nên hỏi lại giảng viên hoặc nơi thực tập trước khi tải lên.

[GHI CHÚ: Thanh bổ sung trải nghiệm thực tế, ví dụ đã dùng NotebookLM cho môn nào, nạp bao nhiêu tài liệu, tính năng nào thấy hữu ích nhất.]

8. Câu hỏi thường gặp

NotebookLM có miễn phí không?
Có. Bạn chỉ cần một tài khoản Google là dùng được bản miễn phí với mức sử dụng tiêu chuẩn. Các gói AI Plus, AI Pro, AI Ultra nâng hạn mức lên gấp 2, 4 lần trở lên.

NotebookLM có hiểu tiếng Việt không?
Có. Công cụ hỗ trợ hơn 80 ngôn ngữ, và tiếng Việt nằm trong danh sách ngôn ngữ được hỗ trợ khi nhập file âm thanh. Bạn có thể đổi ngôn ngữ hiển thị trong phần cài đặt tài khoản Google.

NotebookLM khác gì Gemini hay ChatGPT?
Gemini và ChatGPT trả lời dựa trên kiến thức chung rất rộng. NotebookLM chỉ trả lời dựa trên tài liệu bạn nạp vào và luôn kèm trích dẫn, nên phù hợp hơn khi học một môn cụ thể hay làm nghiên cứu.

Dùng NotebookLM viết tiểu luận có bị coi là gian lận không?
Tùy quy định của từng trường và từng giảng viên. An toàn nhất là dùng nó để đọc hiểu, tóm tắt và tra nguồn, còn phần lập luận và câu chữ thì bạn tự viết, đồng thời hỏi rõ quy định về việc sử dụng AI trong môn học.

Tài liệu tải lên có bị dùng để huấn luyện AI không?
Theo Google, dữ liệu của bạn không được dùng để huấn luyện mô hình trừ khi bạn gửi phản hồi; khi đó Google có thể xem lại toàn bộ ngữ cảnh của lần tương tác ấy.

9. Lời kết

NotebookLM cho sinh viên không phải công cụ học thay bạn, mà là cách rút ngắn quãng đường từ "một đống tài liệu" đến "hiểu được bài". Bạn vẫn phải chọn tài liệu tốt, vẫn phải kiểm tra trích dẫn, vẫn phải tự viết bài. Nhưng việc tóm tắt, hệ thống hóa và ôn tập sẽ nhanh hơn đáng kể. Hãy thử bắt đầu với đúng một môn, nạp giáo trình và slide của môn đó, rồi tự đánh giá xem nó giúp được bạn tới đâu.

Đọc thêm: Sổ tay sinh viên IT.

Nguồn tham khảo

  1. Google. Learn about Gemini Notebook. https://support.google.com/gemininotebook/answer/16164461 (truy cập 14/10/2026).
  2. Google. Add or discover new sources for your notebook. https://support.google.com/gemininotebook/answer/16215270 (truy cập 14/10/2026).
  3. Google. Manage your Gemini Notebook usage limits. https://support.google.com/gemininotebook/answer/17670842 (truy cập 14/10/2026).
  4. Google. Generate Flashcards or Quizzes in Gemini Notebook. https://support.google.com/gemininotebook/answer/16958963 (truy cập 14/10/2026).

Lạm dụng công cụ AI: sinh viên đang đánh mất điều gì?

Có một cảnh khá quen ở giảng đường: đề bài vừa hiện lên màn hình, cả lớp đã mở ChatGPT. Mười phút sau, bài nộp xong, chữ nghĩa trôi chảy, nhưng hỏi lại "vì sao em chọn cách này" thì không ai trả lời được. Việc lạm dụng công cụ AI đang trở thành thói quen mặc định của nhiều sinh viên, và cái giá phải trả không nằm ở điểm số trước mắt mà ở khả năng phản biện và tư duy độc lập về sau. Bài viết này nhìn lại những gì nghiên cứu đã đo được, rồi đưa ra vài cách dùng AI mà vẫn giữ được đầu óc của chính mình.

Lạm dụng công cụ AI làm giảm khả năng phản biện và tư duy độc lập của sinh viên

1. AI đã thành thói quen học tập như thế nào?

Khảo sát sinh viên đại học của Higher Education Policy Institute (HEPI) và Kortext năm 2026, thực hiện trên 1.054 sinh viên toàn thời gian tại Anh, cho thấy 95% sinh viên dùng AI theo ít nhất một hình thức và 94% dùng AI tạo sinh để hỗ trợ bài tập được chấm điểm. Đáng chú ý hơn là tỉ lệ dán thẳng văn bản do AI viết vào bài nộp: 3% năm 2024, 8% năm 2025 và 12% năm 2026 (HEPI, 2026).

Con số ở Việt Nam có thể khác, nhưng xu hướng thì khó mà khác: AI đi từ "công cụ lạ" thành mặc định chỉ trong ba năm. Vấn đề không phải là dùng hay không dùng, mà là dùng theo kiểu nào.

2. Thế nào là lạm dụng công cụ AI?

Dùng AI để giải thích một khái niệm khó, gợi ý dàn ý, kiểm tra lỗi chính tả hay dò ngữ pháp là chuyện bình thường. Lạm dụng là khi AI làm thay phần việc mà lẽ ra chính bạn phải làm để học được điều gì đó.

  • Giao khoán toàn bộ: đưa đề bài vào, lấy đáp án ra, nộp mà không đọc kỹ.
  • Không kiểm chứng: tin mọi con số, trích dẫn, tên tài liệu AI đưa ra mà không mở nguồn gốc.
  • Bỏ qua giai đoạn vật lộn: gặp bài khó là hỏi AI ngay trong ba mươi giây đầu, trước khi kịp nghĩ.
  • Dùng AI để tránh viết: trong khi viết chính là lúc ta phát hiện mình chưa hiểu điều gì.

Ranh giới nằm ở câu hỏi đơn giản: sau buổi học đó, bạn giỏi hơn hay chỉ là bài nộp đẹp hơn?

3. Những hệ luỵ đã được nghiên cứu ghi nhận

3.1. "Nợ nhận thức" tích luỹ dần

Nhóm nghiên cứu do Nataliya Kos'myna (MIT Media Lab) dẫn đầu cho 54 người viết luận trong nhiều phiên, chia thành ba nhóm: dùng ChatGPT, dùng công cụ tìm kiếm, và chỉ dùng đầu mình, đồng thời đo điện não đồ. Nhóm dùng mô hình ngôn ngữ có mức kết nối thần kinh thấp nhất, cảm giác sở hữu bài viết yếu nhất, và nhiều người không trích lại nổi câu trong chính bài vừa viết xong. Các tác giả gọi hiện tượng này là "nợ nhận thức" (cognitive debt): tiện lợi trước mắt, trả giá về sau (Kos'myna và cộng sự, 2025).

Một chi tiết trong nghiên cứu đáng để ý: nhóm viết bằng đầu mình trước rồi mới dùng AI ở phiên sau lại cho thấy mức hoạt động não cao hơn. Thứ tự sử dụng quan trọng không kém việc có dùng hay không.

3.2. Càng tin AI, càng ít phản biện

Nghiên cứu của Hao-Ping Lee và cộng sự (Carnegie Mellon University và Microsoft Research, công bố tại hội nghị CHI 2025) khảo sát 319 người làm việc tri thức với 936 tình huống dùng AI thực tế. Kết quả: càng tin tưởng vào AI thì nỗ lực tư duy phản biện càng giảm, trong khi càng tự tin vào năng lực bản thân thì càng phản biện nhiều hơn. Nhiều người thừa nhận họ không kiểm tra kết quả vì thiếu kiến thức chuyên môn để biết chỗ nào sai (Lee và cộng sự, 2025).

Đây là cái bẫy khó chịu nhất với sinh viên: bạn chỉ phát hiện được AI nói sai ở lĩnh vực bạn đã biết. Mà đi học thì phần lớn là lĩnh vực bạn chưa biết.

3.3. Thói quen "giảm tải nhận thức" ở người trẻ

Michael Gerlich (SBS Swiss Business School) khảo sát 666 người tại Anh và ghi nhận mối tương quan nghịch giữa tần suất dùng công cụ AI và điểm tư duy phản biện, với cơ chế trung gian là "giảm tải nhận thức" — thói quen đẩy việc suy nghĩ sang công cụ bên ngoài. Nhóm 17–25 tuổi phụ thuộc AI nhiều nhất và có điểm phản biện thấp nhất (Gerlich, 2025).

Cần nói rõ: đây là nghiên cứu tương quan, không chứng minh được quan hệ nhân quả. Nhưng tương quan đủ mạnh để bạn tự hỏi mình đang ở phía nào.

4. Rủi ro riêng với sinh viên CNTT

Dân IT hay nghĩ mình an toàn vì "code chạy là đúng". Thực tế ngược lại. Tổ chức METR đã làm một thử nghiệm ngẫu nhiên có đối chứng với 16 lập trình viên giàu kinh nghiệm trên 246 nhiệm vụ thật trong chính kho mã nguồn mở của họ. Khi được phép dùng công cụ AI, họ hoàn thành công việc chậm hơn 19%, dù trước đó tự dự đoán sẽ nhanh hơn khoảng 24% (METR, 2025). Mẫu nhỏ và bối cảnh hẹp, nhưng thông điệp rõ: cảm giác "nhanh hơn" không đáng tin.

Với sinh viên, rủi ro còn nặng hơn một bậc. Code do AI sinh ra chạy được không có nghĩa là đúng về độ phức tạp, an toàn hay khả năng bảo trì. Nếu bạn chưa từng tự tay cài đặt một cấu trúc dữ liệu, bạn sẽ không nhận ra đoạn mã AI đưa ra đang là O(n²) ở chỗ lẽ ra phải là O(n log n). Nền tảng thuật toán vẫn là thứ phải tự mình xây; bạn có thể bắt đầu lại từ loạt bài như Thuật toán Đệ quy và một số bài toán Đệ quy cơ bản.

Một rủi ro nữa ít ai nói: phỏng vấn tuyển dụng. Vòng kỹ thuật thường yêu cầu giải thích lựa chọn thiết kế, không chỉ đưa ra lời giải. Bốn năm quen để AI nghĩ hộ sẽ lộ ra trong bốn mươi phút.

5. Bảy lời khuyên để dùng AI mà không mất tư duy

  1. Nghĩ trước, hỏi sau: dành ít nhất 15–20 phút tự làm trước khi mở AI. Theo nghiên cứu của MIT, trình tự "tự làm trước, dùng AI sau" cho kết quả tốt hơn hẳn chiều ngược lại.
  2. Dùng AI như gia sư, không phải thợ làm bài: thay vì "viết giúp tôi đoạn code này", hãy hỏi "gợi ý cho tôi ba hướng tiếp cận và điểm yếu của từng hướng".
  3. Luôn kiểm chứng nguồn: mọi con số, trích dẫn, tên tài liệu đều phải mở ra xem. AI có thể tạo ra tài liệu tham khảo không tồn tại.
  4. Bắt AI phản biện chính nó: hỏi "lập luận này sai ở đâu", "trường hợp nào thì cách làm này hỏng". Giữ cho mình ở vai người đánh giá.
  5. Giữ vùng không AI: chọn vài môn trụ cột hoặc vài buổi mỗi tuần hoàn toàn không dùng AI, như cách giữ cơ bắp không teo.
  6. Tự kiểm tra lại: sau khi hoàn thành bài, gấp màn hình lại và giải thích thành tiếng. Không nói trôi được tức là chưa hiểu.
  7. Tôn trọng quy định của trường: mỗi môn có yêu cầu khác nhau về mức độ dùng AI. Hỏi giảng viên trước, đừng đoán.

Xem thêm: [ML 1] Tổng quan về Machine Learning — hiểu cơ chế hoạt động của mô hình cũng là một cách để bớt tin tưởng mù quáng vào kết quả của nó.

6. Một vài lưu ý thật lòng

Bài này không khuyên bạn tẩy chay AI. Tẩy chay cũng là một kiểu thiệt thòi, vì kỹ năng làm việc cùng AI đang trở thành yêu cầu tuyển dụng thật. Điều cần tránh là trạng thái trung gian tệ nhất: dùng nhiều nhưng không hiểu, nhanh nhưng không kiểm soát.

Cũng cần công bằng với các nghiên cứu được dẫn ở trên. Nghiên cứu của MIT có cỡ mẫu nhỏ và tại thời điểm công bố là bản tiền ấn phẩm; nghiên cứu của Gerlich là tương quan; khảo sát HEPI thực hiện tại Anh. Chúng là tín hiệu cảnh báo đáng tin, không phải phán quyết cuối cùng. Hãy đọc chúng với đúng tinh thần phản biện mà chúng đang nói tới.

7. Câu hỏi thường gặp

Dùng AI để học có bị coi là gian lận không?
Tuỳ quy định từng môn và từng trường. Dùng để hiểu bài, gợi ý hướng làm thường được chấp nhận; nộp nguyên văn sản phẩm do AI tạo thường không. Cách an toàn nhất là hỏi giảng viên và ghi rõ phần nào có hỗ trợ của AI.

Mình đã lỡ phụ thuộc AI vài học kỳ, còn cứu được không?
Được. Nghiên cứu của MIT cho thấy những người có nền tảng tư duy tốt khi bước vào tương tác với AI vẫn duy trì được mức hoạt động não cao. Hãy bắt đầu bằng việc tự làm trước, dùng AI sau, và chọn vài môn làm "vùng không AI".

AI có thể viết code tốt hơn sinh viên năm nhất, vậy học thuật toán để làm gì?
Để đánh giá được code đó. Người không phân biệt được lời giải đúng với lời giải trông có vẻ đúng sẽ không kiểm soát nổi công cụ, dù công cụ mạnh đến đâu.

Có cách nào biết mình đang lạm dụng không?
Thử một bài kiểm tra nhỏ: tắt mạng và làm lại bài tập tuần trước trong 30 phút. Nếu bạn không nhớ nổi mình đã làm gì, câu trả lời đã rõ.

8. Lời kết

Lạm dụng công cụ AI không gây hậu quả ngay trong một đêm, và đó chính là chỗ nguy hiểm: nó rút dần khả năng phản biện và tư duy độc lập theo kiểu không ai kịp nhận ra. Các nghiên cứu từ MIT, Carnegie Mellon, Microsoft Research và METR đều chỉ về cùng một hướng — phần suy nghĩ mà bạn giao cho máy là phần bạn không còn luyện nữa. Hãy giữ AI ở vai trợ lý: để nó gợi ý, còn quyết định và lập luận thì bạn giữ lại cho mình.

Đọc thêm: Giáo trình mới dành cho sinh viên CNTT.

Nguồn tham khảo

  1. Kos'myna, N. và cộng sự. Your Brain on ChatGPT: Accumulation of Cognitive Debt when Using an AI Assistant for Essay Writing Task. MIT Media Lab, arXiv:2506.08872. https://arxiv.org/abs/2506.08872 (truy cập 07/10/2026).
  2. Lee, H.-P. và cộng sự. The Impact of Generative AI on Critical Thinking. CHI '25, Yokohama. https://advait.org/files/lee_2025_ai_critical_thinking_survey.pdf (truy cập 07/10/2026).
  3. Gerlich, M. AI Tools in Society: Impacts on Cognitive Offloading and the Future of Critical Thinking. Societies, 15(1), 6, 2025. https://doi.org/10.3390/soc15010006 (truy cập 07/10/2026).
  4. HEPI & Kortext. Student Generative AI Survey 2026 (HEPI Report 199). https://www.hepi.ac.uk/reports/student-generative-ai-survey-2026/ (truy cập 07/10/2026).
  5. METR. Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity. https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/ (truy cập 07/10/2026).

[Lập trình Hướng đối tượng với Java] Khai báo lớp (class) và đối tượng (object) [Ví dụ 210916]

[Lập trình Hướng đối tượng với Java] Khai báo lớp (class) và đối tượng (object) [Ví dụ 210916]

Sử dụng ngôn ngữ lập trình Java xây dựng Project BaiThi2 với các class sau:
- Class HinhHoc:
+ Thuộc tính: Tên hình
+ Phương thức: Khởi tạo, nhập thông tin (tên hình và số cạnh)
- Class HinhTron (hình tròn), kế thừa lớp HinhHoc, bổ sung thêm các thuộc tính và phương thức:
+ Thuộc tính: r (bán kính)
+ Phương thức: Nhập thông tin (kế thừa từ lớp HinhHoc; bố sung thêm nhập r), tính chu vi, tính diện tích, in kết quả.


* Lưu ý: 
Tạo project: KhaiBaoClass_Object.
Code:

package baithi2;
import java.util.Scanner;

// class HinhHoc
class HinhHoc{
    // thuoc tinh
    String tenHinh;
    // khoi tao
    public HinhHoc(String tenHinh){
        this.tenHinh=tenHinh;
    }
    // nhap thong tin
    void NhapTT(){
        Scanner inp=new Scanner(System.in);
        System.out.print("\n Nhap ten hinh: ");
        tenHinh=inp.nextLine();
    }
}
// class HinhTamGiac
class HinhTron extends HinhHoc{
    // thuoc tinh
    float r;
    // khoi tao
    public HinhTron(String tenHinh,float r){
        super(tenHinh);
        this.r=r;       
    }
    // Nhap thong tin
    void NhapTT(){
        super.NhapTT();
        Scanner inp=new Scanner(System.in);
        System.out.print("\n Nhap ban kinh: ");
        do{       
        System.out.print("\n + r: ");
        r=inp.nextFloat();
        if (r<=0)
            System.out.print("\n => Nhap lai ban kinh duong tron! ");
        }while(r<=0);
    }
    // Tinh chu vi
    float ChuVi(){
        return (float)(2*Math.PI*r);
    }
    // tinh dien tich
    float DienTich(){
        return (float)Math.PI*r*r;
    }

----------


Cùng bạn tự học CNTT - tailieucntt.org
    // In ket qua
    void InKQ(){
        System.out.print("\n In ket qua: ");
        System.out.print("\n + Ten hinh: "+tenHinh);
        System.out.print("\n + Chu vi: "+ChuVi());
        System.out.print("\n + Dien tich : "+DienTich());               
    }
}

// class chính
public class BaiThi2 {  
    public static void main(String[] args) {
        // khai bao doi tuong
        HinhTron tr=new HinhTron("",1);
        tr.NhapTT();
        tr.InKQ();
    }
   

}

Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Tài liệu: Lập trình hướng đối tượng JAVA core dành cho người mới bắt đầu học lập trình [Click để xem]

# Khoá học online: Lập trình Java trong 4 tuần [Click để xem]


* Có thể bản quan tâm: [MMO] Hướng Dẫn *Kiếm Tiền Tự Động* Với Các Ứng Dụng Treo Máy *CỰC KỲ ĐƠN GIẢN VÀ HIỆU QUẢ*

[ C++ ] Tính đa hình, phương thức ảo, lớp trừu tượng trong C++ [Lập trình hướng đối tượng với C++]

[ C++ ] Tính đa hình, phương thức ảo, lớp trừu tượng trong C++ [Lập trình hướng đối tượng với C++]


* TÍNH ĐA HÌNH (Polymorphism)

Phương thức của lớp cha khi thực hiện sẽ được thay thế bằng một phương thức của lớp con thì phương thức này gọi là có tính đa hình. Tính đa hình giúp cho việc lập trình đơn giản và dễ mở rộng. Để cài đặt phương thức có tính đa hình ta dùng phương thức ảo và phương thức thuần ảo.

Tính đa hình, phương thức ảo, lớp trừu tượng trong C++


* PHƯƠNG THỨC ẢO (virtual method)

Phương thức ảo là phương thức được định nghĩa ở lớp cơ sở (lớp cha) mà các lớp dẫn xuất (lớp con) muốn sử dụng phải định nghĩa lại. Dùng từ khoá virtual để khai báo phương thức ảo:

Cú pháp: 


           virtual <kiểu trả về> <tên phương thức >(<d/s tham số>)
             {
                …
              }

Phương thức khởi tạo không được là phương thức ảo nhưng phương thức hủy bỏ có thể là phương thức ảo. Dùng phương thức ảo chậm hơn phương thức thông thường vì khi thực hiện mới được xác định cụ thể.


Ví dụ [Code Tubor C++ 3.0/4.5]:

#include <iostream.h>
#include <conio.h>
class A
{
  public:
  virtual void Chao() //phuong thuc ao
 {
  cout<<"\nA chao cac ban";
 }
};

// class B
class B:public A
{
  public:
  void Chao()
   {
     cout<<"\nB chao cac ban";
   }
 };


// class C
class C:public A
{
  public:
  void Chao()
  {
    cout<<"\nC chao cac ban";
  }
};
// ham main
void main()
{
   A a;
   A *pa= new A; pa->Chao(); //goi chao cua A
   B b;
   pa=&b; pa->Chao(); //goi chao cua B
   C c;
   pa=&c; pa->Chao(); //goi chao cua C
   getch();
}



Nhận xét:

- Phương thức Chao() có tính đa hình: cùng lời gọi pa->chao() nhưng lần 1 gọi chao cua A, lan 2 gọi chao cua B, lan 3 goi chao cua C.

- Nếu trong lớp B, C không định nghĩa lại phương thức chào thì cả ba lần đều gọi chào của A.

- Nếu phương thức chao() trong lớp A không khai báo virtual thì phương thức chao() sẽ không có tính đa hình, khi đó cả ba lần đều gọi chào của A.

- Có thể gán địa chỉ của đt thuộc lớp con vào biến con trỏ, trỏ tới đt thuộc lớp cha nhưng không thể làm ngược lại (áp dụng nguyên tắc “con gán vào cha” đối với biến kiểu đối tượng hoặc biến kiểu con trỏ, trỏ tới đối tượng)

* PHƯƠNG THỨC TRỪU TƯỢNG, LỚP TRỪU THƯỢNG

Phương thức trừu tượng (thuần ảo) là phương thức ảo nhưng không có lệnh (phương thức rỗng). Phương thức thuần ảo có dạng:

Cú pháp: 

             virtual <kiểu trả về> <tên phương thức >(<d/s tham số>) = 0;

Lớp có phương thức ảo gọi là lớp trừu tượng (abstract class). Nếu một lớp thừa kế lớp trừu tượng mà không định nghĩa lại phương thức thuần ảo thì lớp thừa kế cũng là lớp trừu tượng.

Lưu ý: không được tạo đối tượng thuộc lớp trừu tượng.

Thường ta chọn phương thức ở lớp cha, mà chưa thể xác định cách thực hiện, làm phương thức  thuần ảo. Ở lớp con ta sẽ định nghĩa lại phương thức thuần ảo, để xác định cụ thể cách thức thực hiện.

Ví dụ:

Nhập một danh sách gồm giảng viên và sinh viên, in ra danh sách những người được thưởng. Biết rằng điều kiện được thưởng là giảng viên có số bài báo >3, sinh vien có điểm thi tốt nghiệp >8.

[Code Tubor C++ 3.0/4.5]

#include <iostream.h>
#include <conio.h>

class Nguoi
{
  char hoten[30];
  public:
  virtual void nhap() //phuong thức ảo
 {
   cout<<"\nHo ten:"; cin.getline(hoten,30);
  }
  virtual int thuong()=0; //phuong thức thuần ảo
  virtual void xuat() //phuong thức ảo
  {
    cout<<"\nHo ten:"<<hoten;
  }
 };
// class Sinhvien
class Sinhvien:public Nguoi
 {
  float dttn;
  public:
  void nhap() //dinh nghia l?i phuong th?c nh?p
  {
    Nguoi::nhap();
    cout<<"\nDiem thi tn:"; cin>>dttn;
   }
   int thuong() //định nghĩa lại phương thức thưởng
   {
      return (dttn>8?1:0);
   }
   void xuat() //dinh nghia lại phuong thức xuất
   {
     cout<<"\n-Sinh vien:";
     Nguoi::xuat();
     cout<<"\nDiem thi tn:"<<dttn;
    }
  };
// class Giangvien
class Giangvien:public Nguoi
 {
   int sobaibao;
   public:
   void nhap()
   {
     Nguoi::nhap();
     cout<<"\nSo bai bao:"; cin>>sobaibao;
   }
   int thuong()
   {
     return (sobaibao>3?1:0);
   }
   void xuat()
   {
     cout<<"\n-Giang vien:";
     Nguoi::xuat();
     cout<<"\nSo bai bao:"<<sobaibao;
    }
 };
// hàm main
void main()
{
   Nguoi *ds[100]; int k=0, chon, i;
   while(1)
   {
      cout<<"\n*Gv/Sv/Ngung (1,2,3):"; cin>>chon; cin.get();
      if (chon==3) break;
      if (chon==1) ds[k]=new Giangvien();
      if (chon==2) ds[k]=new Sinhvien();
      ds[k]->nhap(); k++;
   }
   cout<<"\n*Danh sach nhung nguoi duoc thuong";
   for (i=0; i<k; i++)
      if (ds[i]->thuong()) ds[i]->xuat();
  getch();
}







Hãy mở rộng bài tập trên bằng cách thêm một lớp nhân viên, biết rằng nhân viên có số ngày nghỉ trong năm < 5  là được thưởng.

Nhận xét:

Do phương thức “nhập, thưởng, xuất” là phương thức ảo của lớp người (lớp cha) nên các phương thức này khi thực thi sẽ có tính đa hình: có khi gọi “nhập, thưởng, xuất” của lớp giảng viên (lớp con), có khi thì gọi “nhập, thưởng, xuất” của lớp sinh viên (lớp con) tuỳ theo con trỏ ds[i] đang giữ địa chỉ của đối tượng giảng viên hay sinh viên.


Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Giáo Trình: Kỹ Thuật Lập Trình C/C++ Căn Bản Và Nâng Cao [Click để xem]

# Khoá học online: Học lập trình C/C++ TỪ A - Z [Click để xem]




Chúc các bạn thành công!

 

----------

[Tự học lập trình C/C++] Bài 14: Lập trình hướng đối tượng (OOP) với C++

---------------------------------
* TÓM TẮT LÝ THUYẾT
---------------------------------
1. Giới thiêu lập trình hướng đối tượng (OOP) với C++
- C++ là ngôn ngữ "lai" giữa lập trình Cấu trúc và Lập trình hướng đối tượng.
- Lập trình hướng đối tượng (OOP- Object-Oriented Programming) là một cách tư duy mới, tiếp cận hướng đối tượng để giải quyết vấn đề bằng máy tính. Thuật ngữ OOP ngày càng trở nên thông dụng trong lĩnh vực công nghệ thông tin.
- Lập trình hướng đối tượng (OOP) là một phương pháp thiết kế và phát triển phần mềm dựa trên kiến trúc lớp và đối tượng.  
- Trong lập trình hướng đối tượng trong mỗi chương trình chúng ta có một số các đối tượng (object) có thể tương tác với nhau , thuộc các lớp (class) khác nhau, mỗi đối tượng tự quản lý lấy các dữ liệu của riêng chúng.

2. Khai báo lớp (class), đối tượng (object)
i) Đối tượng (object)
Đối tượng là một thực thể phần mềm bao bọc các thuộc tính và các phương thức liên quan.  

ii) Lớp (class)
Lớp (class) là một thiết kế (blueprint) hay một mẫu ban đầu (prototype) định nghĩa các thuộc tính và các phương thức chung cho tất cả các đối tượng của cùng một loại nào đó.  
Một đối tượng là một thể hiện cụ thể của một lớp.

iii) Khai báo lớp và đối tượng
a. Khai báo lớp
+ Lớp gồm 2 thành phần:
 - Thuộc tính (attribute)
 - Phương thức (method)

+ Khai báo:
class  <Tên lớp>
    {        
         public:
             (danh sách các thành viên [bao gồm cả thuộc tính và phương thức]  có đặc tính công cộng)                
         private:
            (danh sách các thành viên [bao gồm cả thuộc tính và phương thức] có đặc tính riêng tư)         
        protected:
            (danh sách các thành viên [bao gồm cả thuộc tính và phương thức] có đặc tính bảo tồn)       
    };  // dấu chấm phẩy chấm dứt câu lệnh

+ Việc sử dụng lớp trong một chương trình C++ có hai phần chính là phần định nghĩa lớp và phần khai báo và truy cập các thành viên của một đối tượng có kiểu là một lớp cho trước.

Ví dụ:
class SV{
// thuoc tinh
public:
char hoTen[30];
int tuoi;
float diem;

// phuong thuc
public:
void NhapDiem();
float TinhDiem();

};


b. Khai báo đối tượng
<Tên lớp> <tên đối tương> = <Tên lớp> ([Tham số khởi dựng]);

Ví dụ:
// t là đối tượng của lớp SV
SV t = SV();


3. Phương thức khởi dụng (constructions) và phương thức hủy (Destructor)
 i) Phương thức khởi dụng (constructions)
+ Các phương thức thiết lập có nhiệm vụ thiết lập thông tin ban đầu cho một đối tượng thuộc về lớp ngay khi đối tượng được khai báo.

+ Đặc điểm của phương thức thiết lập:
 - Tên của phương thức thiết lập trùng với tên lớp.
- Phương thức thiết lập không có giá trị trả về.
  - Một lớp có thể có nhiều phương thức thiết lập khác nhau.
- Trong quá trình tồn tại của đối tượng, chỉ có một lần duy nhất mà phương thức thiết lập được gọi thực hiện mà thôi đó là khi đối tượng ra đời.
- Phân loại phương thức thiết lập: Có thể chia phương thức thiết lập thành 3 loại
  - Phương thức thiết lập mặc định (default contructor): là phương thức thiết lập không nhận tham số đầu vào. Các thông tin ban đầu cho đối tượng của lớp bằng những giá trị mặc định (do lập trình viên quy định). Phương thức thiết lập mặc định không có đối số.
- Phương thức thiết lập sao chép (copy contructor): là phương thức thiết lập nhận tham số đầu vào là 1 đối tượng thuộc cùng 1 lớp. Các thông tin ban đầu của đối tượng sẽ hoàn toàn giống thông tin của đối tượng tham số đầu vào.
- Phương thức thiết lập có tham số: là phương thức thiết lập không thuộc 2 loại trên. Các thông tin ban đầu của đối tượng sẽ phụ thuộc vào giá trị các tham số của phương thức thiết lập.

Ví dụ: xây dựng class CphaSo
class CPhanSo
{
        private:          
            int tu;          
            int mau;
 
        public:
            CPhanSo();          
            CPhanSo(const CPhanSo&);
            CPhanSo(int);          
            CPhanSo(int,int);
};

// Khởi dụng mặc định
CPhanSo::CPhanSo()
{
           tu = 0;  
           mau = 1;
}

//Khởi dựng sao chép
CPhanSo::CPhanSo(const CPhanSo& x)
{  
          tu = x.tu;  
          mau = x.mau;
}

//Khởi dụng 1 tham số
CPhanSo::CPhanSo(int t)
{
             tu = t;  
             mau = 1;
}

   // Khởi dựng 2 tham số
CPhanSo::CPhanSo(int t, int m)
{
         tu = t;
         mau = m;
}

 ii) Phương thức hủy (Destructor)
+ Phương thức hủy có nhiệm vụ thu hồi lại bộ nhớ được cấp phát cho đối tượng thuộc lớp ngay khi đối tượng hết phạm vi hoạt động.

+ Các đặc điểm của phương thức hủy:
- Phương thức hủy có tên trùng với tên lớp (có thêm dấu ~ phía trước).
- Phương thức hủy không có giá trị trả về và cũng không nhận tham số đầu vào.
- Mỗi lớp chỉ có nhiều nhất một phương thức hủy. Nếu lập trình viên không xây dựng hàm hủy thì trình biên dịch sẽ tạo ra một phương thức hủy mặc định.
- Phương thức hủy chỉ được tự động gọi thực hiên một lần duy nhất (khi đối tượng hết phạm vi hoạt động).
- Phương thức hủy phải được xây dựng khi trong phương thức khởi tạo, ta có sử dụng các hàm cấp phát bộ nhớ thì ta bắt buộc phải xây dựng phương thức hủy để thu hồi các bộ nhớ này lại.

Ví dụ:
class CString
{
private:
    char *_text;    
    int  size;
public:
        CString(char *ch);//Phương thức khởi tạo  
    ~CString(); // Phương thức hủy
};

// Định nghĩa phương thức khởi tạo
CString::CString( char *ch ) 
{  
    size = strlen(ch) + 1;  
    //Cấp phát bộ nhớ cho biến _text  
    _text = new char[size];    
    if(_text)      
        strcpy( _text, ch);
}

// Định nghĩa phương thức hủy
CString::~CString()
{
 
    // Thu hồi bộ nhớ cấp phát cho biến _text
    if (_text)
        delete[] _text;
}

4. Kế thừa (Inheritance)
- Kế thừa là một đặc trưng quan trọng trong lập trình hướng đối tượng (OOP). Sự kế thừa trong các ngôn ngữ lập trình như C++, Java, C#, VB.Net,.. cơ bản là giống nhau.
- Trong lập trình C++, có thêm khái niệm đa kế thừa mà các ngôn ngữ khác đã bỏ chức năng này do sự nhập nhằng khi sử dụng.
- Kế thừa là cách tạo lớp mới từ các lớp đã được định nghĩa từ trước

Ví dụ: 
//  class B kế thừa class A.
 class A{
        ....
      };

     class B:A{
         ...
     };

   * Lưu ý:
    - Một lớp cha có thể có nhiều lớp con (có phép kế thừa)  
    - Đến lượt mình mỗi lớp con lại có thể có các con khác  
    - Trong C++ cho phép đa kế thừa (một lớp con có thể nhận hơn 1 lớp cha)

5. Phương thức ảo (virtual)
 - Phương thức ảo là phương thức được định nghĩa ở lớp cơ sở (lớp cha) mà các lớp dẫn xuất (lớp con) muốn sử dụng phải định nghĩa lại. Dùng từ khoá virtual để khai báo phương thức ảo:

 - Cú pháp:
 
    virtual <kiểu DL> <tên P.Thức>([tham số])    
       {
          …
       }

 -  Phương thức khởi tạo không được là phương thức ảo nhưng phương thức hủy bỏ có thể là phương thức ảo. Dùng phương thức ảo chậm hơn phương thức thông thường vì khi thực hiện mới được xác định cụ thể.

6. Phương thức trừu tượng, và lớp trừu tượng (abstract)
  - Phương thức trừu tượng (thuần ảo) là phương thức ảo nhưng không có lệnh (phương thức rỗng). Phương thức thuần ảo có dạng:

  - Cú pháp:
     virtual <kiểu DL> <tên ph.thức>([tham số]) = 0;

  - Lớp có phương thức ảo gọi là lớp trừu tượng (abstract class). Nếu một lớp thừa kế lớp trừu tượng mà không định nghĩa lại phương thức thuần ảo thì lớp thừa kế cũng là lớp trừu tượng.

  * Lưu ý: 
   - không được tạo đối tượng thuộc lớp trừu tượng.
   - Thường chọn phương thức ở lớp cha, mà chưa thể xác định cách thực hiện, làm phương thức  thuần ảo. Ở lớp con ta sẽ định nghĩa lại phương thức thuần ảo, để xác định cụ thể cách thức thực hiện.

7. Lớp bạn, hàm bạn (Friend)
Trong khi viết các chương trình trong C++, đôi khi chúng ta cần cấp quyền truy xuất cho một hàm tới các thành viên không là các thành viên chung của một lớp. Một truy xuất như thế được thực hiện bằng cách khai báo hàm như là bạn của lớp. Có hai lý do có thể cần đến truy xuất này là:

  - Có thể là cách định nghĩa hàm chính xác. 
  - Có thể là cần thiết nếu như hàm cài đặt không hiệu quả.
- Cách viết một hàm bạn: Để một hàm trở thành hàm bạn, có hai cách viết:

Cách 1: Đặt từ khóa friend trước các hàm được khai báo trong lớp, sau đó xây dựng hàm bên ngoài như bình thường.

class A
{
private:
 //Cac thuoc tinh
public:
 friend void h1(...);
 friend int h2(...);
 ....
  };

void h1(...)
{
 ...
}

int h2(...)
{
 ...
}
 
Cách 2: Dùng từ khóa friend để xây dựng hàm trong định nghĩa lớp.

class A
{
private:
 //Cac thuoc tinh
public:
   friend void h1(...)  
  {
   ...
  }
 
  friend int h2(...)  
  {
   ...

   }

 ...

};

  - Tính chất của hàm bạn:
+ Trong thân hàm bạn của một lớp có thể truy nhập tới các thuộc tính của các đối tượng thuộc lớp này. Đây là khác nhau duy nhất giữa hàm bạn và hàm thông thường.
+ Hàm bạn không phải là phương thức của một lớp, lời gọi của hàm bạn giống như lời gọi của hàm thông thường.


---------------------------------
** VÍ DỤ ***
---------------------------------

Ví dụ 1:

+ Yêu cầu:
Xây dựng lớp cha (Nguoi), lớp con (HocSinh).

+ Code:

#include<conio.h>
#include<stdio.h>
#include<iostream>
#include<string.h>

using namespace std;


// lop cha
class Nguoi
{
protected:
char hoTen[30];  
        int namSinh;  
  private:  
   char soThich[50]; // so thich
  public:  
  // khoi tao lop Nguoi
    Nguoi(){
       strcpy(hoTen,"Nguyen Van A");    
      namSinh=1990;    
      strcpy(soThich,"Lap trinh");  
    }
 
    // In thông tin
void InTT();
};

// lop con
class HocSinh : public Nguoi
{
  protected:
    int maHS;
  public:
    void Nhap();
    void InTT();
};

// InTT cua cha (Nguoi)

void Nguoi::InTT()
{
  cout << "\n Nam sinh : " << namSinh;
  cout << "\n Ho ten : " << hoTen;
  cout << "\n So thich : " << soThich;
}

// InTT cua con (HocSinh)
void HocSinh::InTT()
{
  cout << "\n Ma hoc sinh : " << maHS;
  cout << "\n Nam sinh : " << namSinh;
  cout << "\n Ho ten : " << hoTen;
}

//  Nhap thong tin
void HocSinh::Nhap()
{
  cout << "\n Nam sinh : "; cin>> namSinh;
  cout << "\n Ho ten : "; gets(hoTen);
  cout << "\n Ma hoc sinh: "; cin>> maHS;
}

// ham main
int main(){
    // khai bao doi tuong Nguoi
    Nguoi a;  a.InTT();
   // khai bao doi tuong HocSinh
    HocSinh t;   t.Nhap();  t.InTT();
   return 0;
}

--------------

Ví dụ 2: 

+ Yêu cầu: Phương thức ảo

+ Code:

#include<conio.h>
#include<stdio.h>
#include<iostream>
#include<string.h>

using namespace std;

class A
{
 public: 
 //phuong thuc ao
  virtual void Chao()
  {
    cout<<"\nA chao cac ban";
  }
};

class B:public A
{
 public:
void Chao()
  {
    cout<<"\nB chao cac ban";
  }
};

class C:public A
{
 public:
void Chao()
  {
    cout<<"\nC chao cac ban";
  }
};

// ham main
int main()
{
 A a;
 A *pa= new A;
 pa->Chao(); //goi chao cua A
 B b;
 pa=&b;
 pa->Chao(); //goi chao cua B
 C c;
 pa=&c;
 pa->Chao(); //goi chao cua C
 return 0;
}

/* Giải thích:
- Phương thức Chao() có tính đa hình: cùng lời gọi pa->chao() nhưng lần 1 gọi chao cua A, lan 2 gọi chao cua B, lan 3 goi chao cua C.

- Nếu trong lớp B, C không định nghĩa lại phương thức chào thì cả ba lần đều gọi chào của A.

- Nếu phương thức chao() trong lớp A không khai báo virtual thì phương thức chao() sẽ không có tính đa hình, khi đó cả ba lần đều gọi chào của A.

- Có thể gán địa chỉ của đt thuộc lớp con vào biến con trỏ, trỏ tới đt thuộc lớp cha nhưng không thể làm ngược lại (áp dụng nguyên tắc “con gán vào cha” đối với biến kiểu đối tượng hoặc biến kiểu con trỏ, trỏ tới đối tượng)
*/

--------------

Ví dụ 3:

+ Yêu cầu:
Nhập một danh sách gồm giảng viên và sinh viên, in ra danh sách những người được thưởng. Biết rằng điều kiện được thưởng là giảng viên có số bài báo >3, sinh vien có điểm thi tốt nghiệp >8.

+ Code:

#include<conio.h>
#include<stdio.h>
#include<iostream>
#include<string.h>

using namespace std;

class Nguoi
{
 char hoten[30];
 public:
//phuong thuc ao
 virtual void nhap()
 {
  cout<<"\nHo ten:"; cin.getline(hoten,30);
 }

//phuong thuc thuc ao (truu tuong)

 virtual int thuong()=0;

//phuong thuc ao

 virtual void xuat()
 {
  cout<<"\nHo ten:"<<hoten;
 }
};

// class sinhvien

class Sinhvien:public Nguoi
{
 float dttn;
 public:
//dinh nghia lai phuong thuc nhap
 void nhap()
 {  Nguoi::nhap();
 cout<<"\nDiem thi tn:"; cin>>dttn;
 }

//dinh nghia lai phuong thuc thuong

 int thuong()
 {
   return (dttn>8?1:0);
 }
 void xuat()
 {
  cout<<"\n-Sinh vien:";
  Nguoi::xuat();
  cout<<"\nDiem thi tn:"<<dttn;
 }
};

class Giangvien:public Nguoi
{
  int sobaibao;
 public:
 void nhap()
 {
  Nguoi::nhap();
  cout<<"\nSo bai bao:"; cin>>sobaibao;
 }
 int thuong()
 {
   return (sobaibao>3?1:0);
 }

 void xuat()
 {
  cout<<"\n-Giang vien:";
  Nguoi::xuat();
  cout<<"\nSo bai bao:"<<sobaibao;
 }
};

// ham main
int main()
{
  Nguoi *ds[100]; int k=0, chon, i;
 while(1)
  {
  cout<<"\n*Chon: Gv / Sv / Close (1,2,3):";
  cin>>chon;  cin.get();
  if (chon==3) break;
  if (chon==1) ds[k]=new Giangvien();
  if (chon==2) ds[k]=new Sinhvien();
  ds[k]->nhap(); k++;
 }

 cout<<"\n*Danh sach nhung nguoi duoc thuong";
 for (i=0; i<k; i++)
   if (ds[i]->thuong()) ds[i]->xuat();
return 0;

}

-----------------

Ví dụ 4: (hàm bạn, lớp bạn)

+ Yêu cầu: Viết hàm Area để tính diện tích hình chữ nhật, Area là hàm bạn của lớp Rectangle

+ Code:

#include<conio.h>
#include<stdio.h>
#include<iostream>
#include<string.h>

using namespace std;

class Rectangle
{
private:
 int w;
 int h;
public:
 Rectangle(int, int);
 // khai bao ham ban Area
 friend int Area(Rectangle);
};
Rectangle::Rectangle(int w, int h){
 this->w = w;
 this->h = h;
 }
// ham ban
int Area(Rectangle rec){
 return (rec.w*rec.h);
}
// ham main
int main()
{
   Rectangle rec(2, 5);
   cout<<"Dien tich HCN:  "<<Area(rec);
   return 0;
}

Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Giáo Trình: Kỹ Thuật Lập Trình C/C++ Căn Bản Và Nâng Cao [Click để xem]

# Khoá học online: Học lập trình C/C++ TỪ A - Z [Click để xem]


------------------------
Xem bài khác:

----------

Categories

AI (23) AI programming (1) ASP (1) Android (32) Assembly (17) Biểu diễn thuật toán (1) Bubble-Sort (1) Bài giảng (2) Bài giảng lập trình C và Cpp (21) Bài viết hay (111) Bản đồ tư duy (1) C Plus Plus (102) C/C++ (16) CDSL phân tán (1) CSS (2) Cơ sở dữ liệu (11) Danh ngôn lập trình (1) Datamining (4) Genetic Algorithm (1) Giáo trình (3) Giải thuật tiến hóa - thuật toán di truyền (2) Google App Engine (2) Góc học tập (34) HTML (1) Hướng dẫn sử dụng Emu8086 (1) Học lập trình (133) Học lập trình C và CPP qua ví dụ (17) Java (54) Java Căn bản (6) JavaScript (5) Kỹ năng đọc hiệu quả (1) Kỹ thuật lập trình (16) Kỹ thuật đồ họa máy tính (10) Lý thuyết Cơ sở dữ liệu (2) Lý thuyết đồ thị (10) Lập trình Cơ sở dữ liệu (2) Lập trình Python (2) Lập trình căn bản (8) Lập trình hướng đối tượng với Java (7) Lập trình mobile (9) Lập trình mạng (6) Lập trình nhúng (1) Lập trình trí tuệ nhân tạo (2) ML (1) MS Access (1) Machine learning (6) Mạng máy tính (1) Mẹo tìm kiếm trên Google (1) Nghiên cứu khoa học (5) Ngôn ngữ lập trình (2) Những cuốn sách hay mà bạn nên đọc khi còn trẻ (1) Pascal (3) Phương pháp tính toán tối ưu (2) Phương pháp tối ưu (2) Quản lý dự án CNTT (1) SQL (5) Swift (9) Sách hay (4) Thiết kế Web (2) Thuật toán (50) Thuật toán Sắp Xếp -Sort (9) Thuật toán Tìm kiếm - Search (5) Thuật toán di truyền (4) Thực hành Android (2) Tin học văn phòng (5) Tiện ích máy tính (2) Toán rời rạc (12) Trí tuệ nhân tạo (24) Tài liệu tham khảo (3) Tìm hiểu Blockchain (2) Tự học Android (3) Tự học Android qua ví dụ (1) Tự học JavaScript (1) Tự học lập trình (9) Tự học lập trình Android (17) Tự học lập trình C và CPP (14) Tự học lập trình java qua các ví dụ (8) XML (1) blockchain (2) bài giảng quản lý dự án CNTT (1) bài tập java (3) bài tập lập trình (4) cấu trúc dữ liệu giải thuật (15) hướng dẫn viết báo (1) học lập trình Java (11) học máy (7) hợp ngữ (8) lập trình viên (5) phưng pháp đơn hình (2) thuật toán AI (2) tài liệu CNTT miễn phí (2) tính toán tối ưu (1) tự học lập trình iOS (8) tự học lập trình python (1) ví dụ Assembly (1) Đại số gia tử và ứng dụng (1) Đồ họa (4)