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

Đề tài: [ Solved ]Thừa kế đối với friend function

  1. #1
    Ngày gia nhập
    11 2008
    Bài viết
    3

    Mặc định [ Solved ]Thừa kế đối với friend function

    các bạn cho hỏi là: Theo lý thuyết thì các quan hệ bạn bè ko được thừa kế, thế nhưng trong đoạn code của tôi dưới đây thì một friend function lại được thừa kế (tôi dùng Dev-C++ và compli OK). ko biết là tôi sai chỗ nào, các bạn chỉ giúp: Nội dung của code chỉ là tính diện tích tam giác và chữ nhật thôi.

    C++ Code:
    1. #include <iostream.h>
    2.  
    3. class CRectangle;
    4. class CTriangle;  
    5.  
    6. class CPolygon {    
    7.   protected:
    8.     int width, height;
    9.   public:
    10.     void set_values (int a, int b)
    11.       { width=a; height=b;};
    12.       // ham friend "set_to_value" de truy xuat set_values
    13.        friend void set_to_value(int a, int b, CRectangle &c, CTriangle &d);    
    14.   };
    15.  
    16.  
    17. class CRectangle: protected CPolygon {//CRectangle thừa kế từ class Cpolygon
    18.   public:                            
    19.     int area (void)                  
    20.       { return (width * height); }    
    21.   };
    22. class CTriangle: protected CPolygon {//CTriangle cung thừa kế từ class Cpolygon
    23.   public:
    24.     int area (void)
    25.       { return (width * height / 2); }
    26.   };
    27.  
    28. void set_to_value (int a, int b, CRectangle &c, CTriangle &d)
    29.      {      
    30.       c.set_values(a,b);  //set_to_value co the truy xuất vào set_values của CRectangle .
    31.       d.set_values(a,b);  //=> sai chỗ nào ???
    32.       cout << c.width <<endl;
    33.       cout << c.height <<endl;
    34.       cout << d.width <<endl;
    35.       cout << d.height <<endl;
    36.       }
    37.  
    38. int main () {
    39.  
    40.   CRectangle rect;
    41.   CTriangle trgl;
    42.   set_to_value(4,5,rect,trgl); // nhập vào kích thước 2 cạnh là 4,5.
    43.   //rect.set_values (4,5);
    44.   //trgl.set_values (4,5);
    45.   cout << rect.area() << endl;
    46.   cout << trgl.area() << endl;
    47.   getchar();
    48.   return 0;
    49. }

    Trong code trên, tai sao hàm "set_to_value" là hàm bạn của class Cpolygon (là lớp base) mà lại có thể truy xuất vào các member của class CRectangle và CTriangle. là các class thừa kế từ class Cpolygon

    Thanks,
    thavali
    Đã được chỉnh sửa lần cuối bởi thavali : 21-11-2008 lúc 05:36 PM.

  2. #2
    Ngày gia nhập
    11 2008
    Nơi ở
    Neverland
    Bài viết
    48

    Cái này đâu liên quan gì đến thừa kế hay không thừa kế hàm friend chứ . Và cái hàm friend của bạn đúng là chỉ là friend của class CPolygon thôi và nó có thể truy xuất thành phần width và height của CPolygon . Friend của một lớp được trao quyền truy xuất các thành phần riêng tư private của lớp đó . Và friend không được thừa kế cho nên nếu các class CRectangle và CTriangle có các thành phần private thì hàm trên chịu không thể truy nhập được . Còn phương thức set_values là "public" cả thiên hạ xài được tất nhiên set_to_value xài được . Cái này đâu phải là kế thừa friend . OK friend thì không thể kế thừa .
    I'm superman

  3. #3
    Ngày gia nhập
    11 2008
    Bài viết
    3

    cảm ơn bạn,
    nhưng xin bạn xem lại, ở chỗ:
    C++ Code:
    1. class CRectangle: protected CPolygon
    đã dùng từ khóa protected , nên thành viên (phương thức như cách nói của bạn) set_values đã trở thành protected trong class CRectangle. chứ ko còn là public nữa. Do đó, đáng ra ta ko thể truy xuất vào set_values mới đúng chứ.

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Cái đó là rule thôi : protected có thể được truy xuất bởi hàm thành viên và friend, dù nó có không là friend nó cũngt vẫn có thể truy xuất được protected trong Derived class. Đó không phải là friend được kế thừa, tui nghĩ đơn giản vì compiler nó sẽ coi class Kế thừa như 1 lớp Cha vì quan hệ này là is-a.

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    Bạn làm thế nào mà hay vậy, tui test bằng DevCpp mà có chạy được đâu ?


  6. #6
    Ngày gia nhập
    04 2008
    Bài viết
    336

    Mặc định [ Solved ]Thừa kế đối với friend function

    bạn Hok_bik_zi chưa có dòng using namespace std;
    code ra gió bão

  7. #7
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    hiz không xem kĩ
    Không ưa cái kiểu code mà để trống trơn như vậy, ít ra cũng phải để using std::cout chứ

  8. #8
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    hiz không xem kĩ
    Không ưa cái kiểu code mà để trống trơn như vậy, ít ra cũng phải để using std::cout chứ
    Đọc compiler error chưa đọc đã la làng. Lâu rùi không bị ai xử hả ta ! Anh đá 1 cái là chết ngay nhe em trai !

  9. #9
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    hix xin lỗi cả làng, ẩu quá
    mà thấy cũng ngộ thiệt, đọc lí thuyết thì friend không được thừa kế, mà code này vẫn chạy --> thêm 1 kinh nghiệm

  10. #10
    Ngày gia nhập
    11 2008
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Cái đó là rule thôi : protected có thể được truy xuất bởi hàm thành viên và friend, dù nó có không là friend nó cũngt vẫn có thể truy xuất được protected trong Derived class. Đó không phải là friend được kế thừa, tui nghĩ đơn giản vì compiler nó sẽ coi class Kế thừa như 1 lớp Cha vì quan hệ này là is-a.
    Cảm ơn bác, nhận xét hoàn toàn chính xác. lớp con (derive class) có thể truy xuất được thành viên protected của lớp cha (Derived class). Như vậy, Friend function vẫn ko được thừa kế. (đã đọc lý thuyết nhưng chưa kỹ )


    hiz không xem kĩ
    Không ưa cái kiểu code mà để trống trơn như vậy, ít ra cũng phải để using std::cout chứ
    hì, thì em dùng kiểu C là include thôi, ko chơi kiểu std.


    vậy coi như đã xong, có thể đóng topic lại rồi.
    Thanks mấy bác.

Các đề tài tương tự

  1. Hàm friend qua lại của các member function?
    Gửi bởi cyberman219 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 5
    Bài viết cuối: 26-10-2012, 04:44 PM
  2. Bài tập friend function , tìm lỗi giúp e với
    Gửi bởi longgiahuy trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 06-05-2010, 10:33 AM
  3. Friend Function | Xin chỉ giúp lỗi sai
    Gửi bởi rukawa1184 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 25-03-2010, 07:01 PM
  4. [ Solved ]Lỗi khi sử dụng friend
    Gửi bởi bvKim trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 8
    Bài viết cuối: 19-11-2008, 12:41 PM
  5. [ Solved ]Thắc mắc friend functions
    Gửi bởi dauchuot trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 10
    Bài viết cuối: 06-10-2006, 10:42 AM

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