Xin lỗi vì tiêu đề dài nhưng tôi muốn cụ thể. Tôi dự kiến mã sau đây sẽ hoạt động nhưng không và tôi không thể hiểu tại sao:/Làm thế nào đến một con trỏ đến một lớp dẫn xuất không thể được chuyển đến một hàm mong đợi một tham chiếu đến một con trỏ đến lớp cơ sở?
#include <cstdio>
#include <cassert>
class UniquePointer
{
public:
void Dispose()
{
delete this;
}
friend void SafeDispose(UniquePointer*& p)
{
if (p != NULL)
{
p->Dispose();
p = NULL;
}
}
protected:
UniquePointer() { }
UniquePointer(const UniquePointer&) { }
virtual ~UniquePointer() { }
};
class Building : public UniquePointer
{
public:
Building()
: mType(0)
{}
void SetBuildingType(int type) { mType = type; }
int GetBuildingType() const { return mType; }
protected:
virtual ~Building() { }
int mType;
};
void Foo()
{
Building* b = new Building();
b->SetBuildingType(5);
int a = b->GetBuildingType();
SafeDispose(b); // error C2664: 'SafeDispose' : cannot convert parameter 1 from 'Building *' to 'UniquePointer *&'
b->Dispose();
}
int main(int argc, char* argv[])
{
Foo();
return 0;
}
Lưu ý rằng không có gì "an toàn" về những gì bạn đang cố gắng làm. Nếu 'b' được đặt thành' NULL' thì 'b-> Dispose();' gây ra hành vi giống như undefined như thể 'b' trỏ đến một đối tượng đã xóa. –
@Charles: Đã chỉnh sửa, đang chờ xem xét. Lỗi này không phải là một phần của câu hỏi, phải không? –
Ngoài ra, không cần 'SafeDispose' làm bạn vì' Dispose' là công khai. –