2012-07-10 30 views
10

Đoạn mã dưới đây tạo ra một lỗi:C++ tham số lớp trừu tượng lỗi workaround

#include <iostream> 

using namespace std; 

class A 
{ 

public: 

    virtual void print() = 0; 
}; 

void test(A x) // ERROR: Abstract class cannot be a parameter type 
{ 
    cout << "Hello" << endl; 
} 

Có một giải pháp/cách giải quyết cho lỗi này khác/tốt hơn thay thế

virtual void print() = 0; 

với

virtual void print() = { } 

EDIT: Tôi muốn có thể vượt qua bất kỳ lớp mở rộng/triển khai lớp cơ sở A làm tham số bằng cách sử dụng nhiều hình thái (tức là A* x = new B() ; test(x);)

Cheers

+0

Lớp Abstarct theo định nghĩa sẽ không được tự khởi tạo. Đó là phương pháp cần phải được ghi đè bởi các lớp học có nguồn gốc. Chỉ cần tò mò, bạn đang cố gắng đạt được điều gì bằng cách làm điều này? – Mahesh

+1

Tôi muốn làm một cái gì đó như A x = new B() và vượt qua bất kỳ lớp mở rộng/thực hiện A. Tôi nên đã xác định các câu hỏi tốt hơn tôi đoán. – Cemre

+1

Trước khi cố gắng tìm ra giải pháp/giải pháp khác, chúng tôi cần hiểu vấn đề. Ý tưởng truyền một lớp trừu tượng như một tham số "theo giá trị" không có ý nghĩa gì cả. Bạn đang cố làm gì vậy? – AnT

Trả lời

20

Vì bạn không thể khởi tạo lớp trừu tượng, hãy chuyển một lớp theo giá trị gần như chắc chắn là một lỗi; bạn cần phải vượt qua nó bằng con trỏ hoặc bằng cách tham khảo:

void test(A& x) ... 

hoặc

void test(A* x) ... 

Đi qua bởi giá trị sẽ dẫn đến object slicing, với gần như được đảm bảo để có những hậu quả bất ngờ (một cách xấu), do đó trình biên dịch sẽ đánh dấu nó như một lỗi.

+1

Tôi muốn nói chắc chắn nó được đảm bảo. –

+0

@LuchianGrigore Bạn nói đúng, việc cắt sẽ luôn xảy ra, ngay cả khi không có thành viên dữ liệu bổ sung nào bị cắt bớt, bởi vì vtable sẽ bị "cắt bớt" thành lớp cơ sở. – dasblinkenlight

3

Tất nhiên, thay đổi chữ ký:

void test(A& x) 
//or 
void test(const A& x) 
//or 
void test(A* x) 

Lý do phiên bản của bạn không hoạt động là do một đối tượng kiểu A không hợp lý có ý nghĩa. Nó trừu tượng. Việc truyền tham chiếu hoặc con trỏ đi xung quanh điều này vì loại thực tế được truyền dưới dạng tham số không phải là A, nhưng là lớp thực hiện của A (lớp bê tông có nguồn gốc).

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