30/09/2018, 20:39

Thừa kế trong C++?

Ví dụ có class child thừa kế class parent.
E không hiểu tại sao có thể viết parent *p = new child(); ạ?

Ngô Doãn Tuấn viết 22:55 ngày 30/09/2018

parent *p = new child();

Mình không biết có nhầm không vì cũng lâu lâu không sờ oop
cái kia mình tạo 1 biến con trỏ kiểu parent rồi trỏ tới child();
Cũng tương tự như ;

parent *p;
child c;
p = &c;
... viết 22:51 ngày 30/09/2018

Nhìn vào hình trên thì thấy size của parent chỉ có 8 bytes, size của child là 16 bytes.
Khi cho con trỏ p (của class parent) trỏ đến vùng nhớ của con trỏ c (của class child)
thì 2 dòng dưới cho ra cùng 1 địa chỉ. Nhưng lúc này, p vẫn sử dụng 8 bytes bắt đầu từ địa chỉ đó, trong khi c sử dụng hết 16 bytes.

Nghĩa là con trỏ p chỉ sử dụng được các thành phần mà kiểu child kế thừa từ p thôi chứ không sử dụng được những gì class child định nghĩa thêm. Muốn sử dụng hết chức năng của class child thì phải ép kiểu của p về child.

p = c;
cout << (child*)(void*)p->method_of_class_child() << endl;
viết 22:40 ngày 30/09/2018

p = &c; chứ


có thể hiểu tạm là có thể cho con trỏ lớp mẹ trỏ tới 1 đối tượng lớp con vì con kế thừa từ mẹ tức là có tất có những thuộc tính/phương thức của class mẹ, nên con trỏ class mẹ có thể xem đối tượng class con như là đối tượng class mẹ. ``` Child c; Parent* p = &c; //hợp lệ ```

ngược lại ko đúng: con trỏ class con ko thể trỏ tới 1 đối tương class mẹ được vì có class con sẽ có thêm thuộc tính/phương thức mới khác với lớp mẹ.

Parent p;
//Child* c = &p;  <---- ko đúng
Ngô Doãn Tuấn viết 22:44 ngày 30/09/2018

Dạ vâng. Chỗ đó em ghi nhầm @@

viết 22:45 ngày 30/09/2018

phải cẩn thận hơn nữa. Ép kiểu phải xài dynamic_cast chứ viết (child*)(void*)static_cast từ C khá “nguy hiểm” có thể chạy sai đó.

ví dụ có thêm class OtherChild mà p trỏ tới 1 đối tượng của OtherChild này, lại đi ép kiểu thành kiểu Child kia thì lúc chạy bị lỗi chắc.

Child* c = dynamic_cast<Child*>(p);
if (c) //c != nullptr
{
    //downcast thành công
}
else
{
    //p ko trỏ tới Child mà có thể là OtherChild khác.
}
Sáng Béo viết 22:56 ngày 30/09/2018

E thử ví dụ như thế này thì lại bị lỗi ạ

#include <iostream>
using namespace std;

class Parent{
    public:
        P_Method(){
            cout<<"P_Method"<<endl;
        }
};

class Child:public Parent{
    public:
        C_Method(){
            cout<<"C_Method"<<endl;
        }
};

int main(){
    Child c;
    Parent * p = &c;
    //p->C_Method(); --> Test: Error
    
    Child * ch = dynamic_cast<Child*>(p); //Error
    ch->C_Method();
    
    return 0;
}
... viết 22:53 ngày 30/09/2018

Coi lại tên của constructor

Sáng Béo viết 22:50 ngày 30/09/2018

không có constructor a ạ.
E chỉ gọi hàm trong class thôi.

... viết 22:41 ngày 30/09/2018

Thế thì coi lại cách khai báo hàm trong class. Kiểu trả về của nó đâu?

Sáng Béo viết 22:48 ngày 30/09/2018

Kiểu trả về của nó đâu?

sơ suât quá, e quên mất
thế mà Dev-C++ nó vẫn chạy, không báo lỗi như Visual Studio ạ @@

Lê Đại Tú viết 22:44 ngày 30/09/2018

ủa có hả. mình nhớ trong OOP thằng con có thể new được thằng cha. chứ còn thằng cha làm j new được từ thằng con ?

Sáng Béo viết 22:53 ngày 30/09/2018

nhớ ngược rồi bạn ơi

Bài liên quan
0