2011-08-24 46 views
9

Được rồi vì vậy tôi đã làm việc trên một công cụ trò chơi và tôi đang gặp sự cố ... Hiện tại tôi có một hệ thống phân cấp các lớp (image-> animation-> object) tất cả đều có phương thức get_type() và tôi đang gặp vấn đề này:Lẫn lộn thừa kế

nếu tôi khai báo một lớp có nguồn gốc sử dụng từ khóa mới, hoặc tĩnh, tôi nhận được kết quả mong muốn:

object instance; 
cout << instance.get_type(); //returns an int value 

object* pointer = new(object); 
cout << pointer->get_type(); 

Từ đoạn code trên, giao diện điều khiển đầu ra 3. Phương thức được khai báo như vậy trong đối tượng:

Hình ảnh Class:

class image{ 
public: 
    virtual int get_type(); 
}; 

int object::get_type(){ 
    return 1; 
} 

Animation Class:

class animation: public image{ 
public: 
    virtual int get_type(); 
}; 

int animation::get_type(){ 
    return 2; 
} 

Object Class:

class object: public animation{ 
public: 
    virtual int get_type(); 
}; 

int object::get_type(){ 
    return 3; 
} 

Bây giờ vấn đề nảy sinh khi tôi làm điều gì đó như thế này:

object* t = &object(); 
cout << t->get_type(); 

Kết quả tại là 1.

Nếu tôi loại bỏ các từ khóa ảo từ việc khai báo lớp của đối tượng lớp, nó hoạt động như tôi mong đợi (các bit cuối cùng của mã trả về 3)

Câu hỏi: làm thế nào tôi có thể sử dụng các phương pháp ảo của tôi từ đối tượng * con trỏ mà không sử dụng từ khóa mới? Lý do là, tôi đang làm một vector với các con trỏ tới các đối tượng này và tạo ra chúng như tôi thêm họ, vì vậy tôi hy vọng có thể làm điều gì đó như sau:

vector<object*> objects; //not imgs or animations 
for (int a = 0; a < 20; a++){ 
    objects.push_back(&object()); 
} 

Và có bất kỳ đối tượng [x ] -> get_type(); trả lại loại chính xác loại. Lý do cho việc này là hệ thống sự kiện mà tôi đang sử dụng trong trò chơi của mình cần loại lớp khởi tạo ...

TLDR; Tôi thực sự bốc mùi thừa kế, bạn có thể giúp đỡ không?

+2

Câu hỏi về người mới này cũng được hỏi. – sharptooth

Trả lời

7

Điều này là do cả hai constructor và destructor đã chạy trong mã của bạn:

object* t = &object(); 
cout << t->get_type(); 

Các &object() tạo ra một đối tượng (mang tính chất tạm thời), ngay lập tức hủy diệt nó (vì nó là tạm thời), và sau đó chuyển nhượng địa chỉ của đối tượng bị hủy ngay bây giờ là t. (Trình biên dịch của bạn có thể cảnh báo bạn về biểu hiện này nếu bạn bật mức cảnh báo lên đủ cao.)

Hãy thử tạo một đối tượng mà gậy xung quanh trong thời gian bạn đang sử dụng nó:

object my_object(); 
object *t = &my_object; 
cout << t->get_type(); 

Khi bạn' sử dụng lại các hàm phi ảo, kiểu con trỏ t được sử dụng tại thời gian biên dịch để xác định phương thức cần gọi.Khi bạn đang sử dụng các hàm ảo, thông tin bên trong đối tượng được sử dụng trong thời gian chạy trong khi gửi đi ảo để quyết định chức năng nào cần gọi. Vì đối tượng của bạn không được xây dựng chính xác tại thời điểm cuộc gọi (vì nó đã bị hủy), kết quả là không được xác định đúng nhưng kết thúc là gọi hàm sai.

+0

Làm cách nào để tạo một số lượng biến đổi của các đối tượng này? Tôi có mắc kẹt với việc tạo ra chúng và xóa chúng một cách rõ ràng? – Avlagrath

+0

"Vì đối tượng của bạn không được xây dựng chính xác, kết quả là không được xác định đúng nhưng kết thúc là gọi hàm sai." Làm cách nào để tôi tạo đúng đối tượng? – Avlagrath

+4

Bạn có thể tạo những cái mới trên heap với 'new object()'. Thông thường, đa hình hoạt động tốt nhất khi bạn phân bổ các đối tượng trên heap. –