Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 5 của 5

Chủ đề: Về kế thừa

  1. #1

    Về kế thừa

    Chào các bạn, hôm nay mình đọc sách, thấy có 1 cái code mà không biết nó hiện kết quả ra màn hình như thế nào nên chạy thử. Mình được kết quả:
    Mã:
    A ctor
    C ctor
    A ctor
    B ctor
    D ctor
    còn đây là cái code đó:

    Mã:
    #include <iostream> class A{public:    A();    ~A();};  A::A(){    std::cout << "A ctor
    ";}  A::~A(){    std::cout << "A dtor
    ";}class B : public A{public:    B();    ~B();};  B::B(){    std::cout << "B ctor
    ";}  B::~B(){    std::cout << "B dtor
    ";}class C{public:    C();    ~C();private:    A a;};  C::C(){    std::cout << "C ctor
    ";}  C::~C(){    std::cout << "C dtor
    ";}class D : public C{public:    D();    ~D();private:    B b;};  D::D(){    std::cout << "D ctor
    ";}  D::~D(){    std::cout << "D dtor
    ";}void main() {    D d;    system("pause");}
    Bạn nào có thể giải thích giúp mình tại sao lại hiện ra màn hình như thế không?

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Khi class A kế thừa class B, nếu bạn khởi tạo 1 biến của B nó sẽ chạy hàm khởi tạo của lớp cha trước rồi mới chạy hàm khởi tạo lớp con. viết D d; =>thì nó cấp 1 vùng nhớ cho biến d và chạy hàm tạo của D. Do quan hệ kế thừa nên hàm tạo của D gọi hàm tạo của C, hàm tạo của C gọi hàm tạo của B .... => kết quả thì như bạn thấy đó. Ko có lời gọi hàm tường minh đâu, mấy hàm hủy và tạo là như vậy đó .

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mặc dù đã hiểu là vậy nhưng bạn có thể giải thích kĩ cho mình được không?
    Với lại khi mình gọi
    Mã:
    d.~D()
    thì nó chạy ngược lại với cái trên tức là:
    Mã:
    D dtor
    B dtor
    A dtor
    C dtor
    A dtor
    Theo như bạn nói thì hàm tạo của D gọi hàm tạo của C nhưng hàm tạo của C đâu có gọi hàm tạo của B (đâu kế thừa), mà nó gọi hàm tạo của A, nhưng mình không hiểu tại sao nó lại chạy hàm tạo của A trước mà không chạy hàm tạo của C trước(Vì chỗ hàm tạo của D thì nó không chạy hàm tạo của B)? Giải thích hộ mình phần destructor luôn với!

  4. #4
    D kế thừa từ C
    D có chứa B
    C có chứa A
    B kế thừa từ A

    khởi tạo D thì base class sẽ được khởi tạo trước, rồi mới tới mấy biến của D, rồi mới vào thân hàm của ctor.
    như vậy theo thứ tự thì:
    D() = C() -> B() -> D
    khi khởi tạo C, cũng theo thứ tự base class -> biến -> thân hàm của C(). Vì C ko có base class (ký hiệu là ...) mà chỉ có biến C nên thứ tự là
    C() = ... -> A() -> C = A() -> C
    khi khởi tạo B, cũng theo thứ tự base class -> biến -> thân hàm của B(). Vì B ko có biến mà chỉ có base class là A nên
    B() = A() -> ... -> B = A() -> B
    khi khởi tạo A, cũng theo thứ tự base class -> biến -> thân hàm của A(). Vì A ko có biến và ko có base class nên
    A() = A

    thế vào là ra
    D() = A -> C -> A -> B -> D


    *: dtor là ngược lại với ctor. Viết được trình tự ctor rồi chỉ cần đảo lại là ra trình tự dtor:
    ~D() = D -> B -> A -> C -> A

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi INTP
    D kế thừa từ C
    D có chứa B
    C có chứa A
    B kế thừa từ A

    khởi tạo D thì base class sẽ được khởi tạo trước, rồi mới tới mấy biến của D, rồi mới vào thân hàm của ctor.
    như vậy theo thứ tự thì:
    D() = C() -> B() -> D
    khi khởi tạo C, cũng theo thứ tự base class -> biến -> thân hàm của C(). Vì C ko có base class (ký hiệu là ...) mà chỉ có biến C nên thứ tự là
    C() = ... -> A() -> C = A() -> C
    khi khởi tạo B, cũng theo thứ tự base class -> biến -> thân hàm của B(). Vì B ko có biến mà chỉ có base class là A nên
    B() = A() -> ... -> B = A() -> B
    khi khởi tạo A, cũng theo thứ tự base class -> biến -> thân hàm của A(). Vì A ko có biến và ko có base class nên
    A() = A

    thế vào là ra
    D() = A -> C -> A -> B -> D


    *: dtor là ngược lại với ctor. Viết được trình tự ctor rồi chỉ cần đảo lại là ra trình tự dtor:
    ~D() = D -> B -> A -> C -> A
    cảm ơn @INTP nhiều lắm [IMG]images/smilies/biggrin.png[/IMG]

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •