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

Đề tài: Thắc mắc về Hàm ảo

  1. #1
    Ngày gia nhập
    02 2008
    Nơi ở
    Future
    Bài viết
    25

    Mặc định Thắc mắc về Hàm ảo

    Code:
    #include<iostream>
    using namespace std;
    class CParent
    {
    public:
    	virtual void f()
    	{
    		cout<<"is Parent!";
    	}
    	void run()
    	{
    		f();
    	}
    };
    class CChild:public CParent
    {
    public:
    	void f()
    	{
    		cout<<"is Child!";
    	}
    };
    int main()
    {
    	CChild C;
    	C.run();
    	return 0;
    }
    in ra kết quả là : is Child
    Có ai có thể giải thích rõ cho em hiểu tại sao nó ko chọn hàm ảo (virtual f()) .Nếu class Parent , hàm f() ko có virtual thì kết quả sẽ là is Parent . Mong được giải thích sâu ah , thz rất nhiều ^ ^
    Bể học mênh mông , quay đầu ....là bờ !

  2. #2
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Lúc đầu do khi khởi tạo một đối tượng thuộc lớp dẫn suất thì nó sẽ khởi tạo một đối tượng thuộc lớp cơ sở trước nên thằng vftable của lớp Cparent nó sẽ giử địa chỉ của hàm f trong lớp CParent.
    1. Nếu có từ khóa virtual thì nó báo rằng đây có một sự đa xạ ở đây (có 1 mảng con trỏ để quản lý [__vfptr](virtual function pointer)) và thằng vftable của lớp CParent nó sẽ giữ địa chỉ của phương thức f() trong lớp Cparent -> sau khi thực hiện phương thức khởi tạo xong thì nó sẽ giữ địa chỉ của phương thức f trong lớp Cchild -> phương thức được gọi thực hiện là f trong cchild.
    2. Nếu không thấy từ khóa virtual thì nó sẽ không thay đổi giá trị của thằng vftable trong lớp CParent -> nó sẽ thực hiện phương thức của Cparent.

  3. #3
    Ngày gia nhập
    07 2007
    Bài viết
    41

    Không là virtual method thì nó chui vào trong vtable làm gì để rồi không thấy => không thay đổi.

  4. #4
    Ngày gia nhập
    02 2008
    Nơi ở
    Future
    Bài viết
    25

    Trích dẫn Nguyên bản được gửi bởi zkday2686 Xem bài viết
    Lúc đầu do khi khởi tạo một đối tượng thuộc lớp dẫn suất thì nó sẽ khởi tạo một đối tượng thuộc lớp cơ sở trước nên thằng vftable của lớp Cparent nó sẽ giử địa chỉ của hàm f trong lớp CParent.
    1. Nếu có từ khóa virtual thì nó báo rằng đây có một sự đa xạ ở đây (có 1 mảng con trỏ để quản lý [__vfptr](virtual function pointer)) và thằng vftable của lớp CParent nó sẽ giữ địa chỉ của phương thức f() trong lớp Cparent -> sau khi thực hiện phương thức khởi tạo xong thì nó sẽ giữ địa chỉ của phương thức f trong lớp Cchild -> phương thức được gọi thực hiện là f trong cchild.
    2. Nếu không thấy từ khóa virtual thì nó sẽ không thay đổi giá trị của thằng vftable trong lớp CParent -> nó sẽ thực hiện phương thức của Cparent.
    Anh có thể nói 1 chút về vftable là ji ko , thật sự thì học xong bài này , cũng ko nghe nói gì đến vftable nên hơi xa lạ . Thz for share ^ ^
    Bể học mênh mông , quay đầu ....là bờ !

  5. #5
    Ngày gia nhập
    09 2007
    Bài viết
    724

    @zxc: cám ơn bạn đã chỉ ra chổ sai cho mình.
    @-xme-: vftable = virtual function table cái này là 1 định nghĩa để quản lý các phương thức ảo trong quan hệ kế thừa;
    chi tiết bạn xem tại: http://www.lrdev.com/lr/c/virtual.html

    giờ mình sẽ giải thích lại vì sao khi không có virtual nó lại thực hiện như vậy:

    lúc bạn gọi câu lệnh C.run(); thì đối tượng C thuộc lớp CChild và hàm run của CChild có địa chỉ trùng với địa chỉ của hàm run() trong lớp CParent. vậy nó sẽ thực thi hàm run của lớp CParent.

    bên trong hàm run(). thì bạn khai báo
    PHP Code:
    void run()
    {
       
    f();

    cái này bạn tương đương với câu lệnh:

    PHP Code:
    void run()
    {
         
    this->f();

    và lúc này cái đang gọi hàm f() thực chất là this của lớp CParent chứ không phải là của đối tượng C nữa.
    ==> cái mà bạn thấy thì đã rõ.

    đối với khi có từ khóa virtual thì mình giải thích ở trên rồi bạn xem lại nhé.

    chúc bạn thành công.
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 19-08-2008 lúc 05:19 PM.

  6. #6
    Ngày gia nhập
    02 2008
    Nơi ở
    Future
    Bài viết
    25

    Mặc định Thắc mắc về Hàm ảo

    thz a đã rất nhiệt tình , hi vọng sẽ được học hỏi nhiều hơn nữa ^_____^
    Bể học mênh mông , quay đầu ....là bờ !

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