2013-02-19 24 views
5

Code:công đoàn không thể chứa một đối tượng mà có chức năng ảo

struct A{ 
    int a; 
    virtual void f(){} 
}; 
union B{ 
    A ob; 
}; 

Compile-time Error:

C:\to\main.cpp|9|error: member 'A B::ob' with constructor not allowed in union| 
C:\to\main.cpp|9|error: member 'A B::ob' with copy assignment operator not allowed in union| 
||=== Build finished: 2 errors, 0 warnings ===| 

C++ 03 Tiêu chuẩn:

An object of a class with a non-trivial constructor (12.1), a non-trivial copy constructor (12.8), a non-trivial destructor (12.4), or a non-trivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an array of such objects. If a union contains a static data member, or a member of reference type, the program is ill-formed.

Sta ndard không nói bất cứ điều gì về một đối tượng của một lớp với một hàm ảo, và từ lỗi, trình biên dịch phàn nàn về hàm tạo và toán tử gán-sao chép mà tôi không sử dụng. đây có phải là lỗi trình biên dịch không? Im sử dụng gcc.

+0

Bằng không tầm thường, nghĩ rằng POD (http://en.wikipedia.org/wiki/Plain_old_data_structure) – Benj

+0

@Benj Tôi không biết những gì không tầm thường có nghĩa là, nhưng im chắc chắn nó không POD vì nó A có thể có một lớp cơ sở, trong này tôi không nhận được một lỗi, vì vậy dữ liệu thành viên công đoàn không phải là một POD. – AlexDan

+0

Nếu bạn xem bài viết tôi đã tham chiếu, bạn sẽ thấy rằng các công đoàn được đề cập cụ thể liên quan đến POD. Cũng có thể cho một lớp là POD. – Benj

Trả lời

10

Hàm khởi tạo mặc định được khai báo ngầm, hàm tạo bản sao và toán tử gán bản sao cho cấu trúc đó là không tầm thường vì nó có hàm virtual, vì vậy bạn đã phá vỡ các yêu cầu đó.

A constructor is trivial if it is an implicitly-declared default constructor and if:

  • its class has no virtual functions (10.3) and no virtual base classes (10.1), and
  • [...]

A copy constructor for class X is trivial if it is implicitly declared and if

  • class X has no virtual functions (10.3) and no virtual base classes (10.1), and
  • [...]

A copy assignment operator for class X is trivial if it is implicitly declared and if

  • class X has no virtual functions (10.3) and no virtual base classes (10.1), and
  • [...]

C++ 11 trích dẫn là tương tự (nó chỉ bao gồm nhà xây dựng di chuyển và toán tử gán) nhưng C++ 11 không có yêu cầu cùng các thành viên của đoàn.

+0

Ngắn, ngọt và cho điểm. –

0

Sử dụng C++ 11 nếu bạn có thể, nó không chứa hạn chế như vậy

+0

Nó có những hạn chế khác, làm cho nó cực kỳ khó thay vì không thể. –

Các vấn đề liên quan