Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Cách gọi tới phương thức của lớp cơ sở ảo trong đa kế thừa !!?

  1. #1
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Mặc định Cách gọi tới phương thức của lớp cơ sở ảo trong đa kế thừa !!?

    Mình có 3 class sau:
    C++ Code:
    1. class Human
    2. {
    3.      //Cac thuoc tinh
    4.      virtual void show();
    5. };
    6.  
    7.  
    8. class Worker: virtual public Human
    9. {
    10.      //Cac thuoc tinh thêm khac
    11.      void show();
    12. };
    13.  
    14. class Person: public Human
    15. {
    16.      //Cac thuoc tinh thêm khac
    17.      void show();
    18. };
    19.  
    20. class Employee: public Person, public Worker
    21. {
    22.      //Cac thuoc tinh thêm khac
    23.      void show();
    24. };


    Mình có 1 đối tượng lớp Employee em;
    Hỏi để gọi tới method show của lớp Human thì gọi như thế nào !!!
    em.Worker::Human::show(); gọi ntn thì compiler báo lỗi error: `Human' is an ambiguous base of `Employee'
    Đã được chỉnh sửa lần cuối bởi dehin : 14-01-2013 lúc 11:43 AM.

  2. #2
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Theo mình là như thế này :

    Ta có:
    Employee thừa kế từ 2 class : Person và Worker.
    Person thừa kế từ Human.
    Worker thừa kế virtual từ Human.

    Khi Employee được khởi tạo :
    - Theo tính chất của thừa kế virtual thì Employee sẽ chịu trách nhiệm gọi hàm tạo của Human mà Worker thừa kế, và việc này được làm đầu tiên.

    - Việc tiếp theo là gọi hàm tạo của Human mà Person thừa kế ( do Person không thừa kế virtual từ Human ).

    => Tồn tại 2 thực thể Human trong Employee, hơn nữa, Person và Worker lại có 2 hàm cùng tên là show, kể cả là hàm virtual thì vẫn phải theo luật thừa kế, đó là chọn lấy 1 cái để thừa kế, tuy nhiên, lại có 2 thực thể Human => xảy ra vấn đề "Diamond" => "ambiguity".


    Giải quyết như sau :
    C++ Code:
    1. #include <iostream>
    2.  
    3. class Human
    4. {
    5. public:
    6. Human() {  std::cout <<"Human constructor" <<std::endl; }
    7.  virtual void show() { std::cout <<"Human" <<std::endl; }
    8.  
    9. };
    10.  
    11. class Worker: virtual public Human
    12. {
    13. public:
    14. Worker() {  std::cout <<"Worker constructor" <<std::endl; }
    15.      void show(){ std::cout <<"Worker" <<std::endl; }
    16. };
    17.  
    18. class Person: virtual public Human
    19. {
    20. public:
    21. Person() {  std::cout <<"Person constructor" <<std::endl; }
    22. void show(){ std::cout <<"Person" <<std::endl; }
    23. };
    24.  
    25. class Employee: public Person, public Worker
    26. {
    27. public:
    28. Employee() {  std::cout <<"Employee constructor" <<std::endl; }
    29. void show(){ std::cout <<"Employee" <<std::endl; }
    30. };
    31.  
    32. int main()
    33. {
    34. Employee employee;
    35. employee.show();
    36.  
    37. return 0;
    38. }

    Human constructor
    Person constructor
    Worker constructor
    Employee constructor
    Employee
    Như bạn thấy đó, giờ thì chỉ có 1 thực thể Human trong Employee, việc gọi hàm virtual cũng như mong đợi.

  3. #3
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Um để cả 2 lớp Worker, và Person thừa kế virtual từ lớp Human thì OK rồi.
    Tại đọc trong giáo trình thấy bảo chỉ cần 1 lớp khai báo kế thừa virtual từ Human ( Worker hoặc Person) thì lớp Human trỏ thành lớp cơ sở ảo ( virtual base ) nên mới để vậy....

  4. #4
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Trích dẫn Nguyên bản được gửi bởi dehin Xem bài viết
    Um để cả 2 lớp Worker, và Person thừa kế virtual từ lớp Human thì OK rồi.
    Tại đọc trong giáo trình thấy bảo chỉ cần 1 lớp khai báo kế thừa virtual từ Human ( Worker hoặc Person) thì lớp Human trỏ thành lớp cơ sở ảo ( virtual base ) nên mới để vậy....
    Bạn up nguyên bản giáo trình đó lên đây đi.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn