Tôi có một lớp cơ sở và lớp con của nó:Quay trở lại std :: make_unique <SubClass> hoạt động như thế nào?
class Base {
public:
virtual void hi() {
cout << "hi" << endl;
}
};
class Derived : public Base {
public:
void hi() override {
cout << "derived hi" << endl;
}
};
Đang cố gắng để tạo ra một hàm mà tạo ra một con trỏ duy nhất của một đối tượng nguồn gốc.
1) Cái này hoạt động:
std::unique_ptr<Base> GetDerived() {
return std::make_unique<Derived>();
}
2) Nhưng, cái này thất bại trong việc biên dịch:
std::unique_ptr<Base> GetDerived2() {
auto a = std::make_unique<Derived>();
return a;
}
3) std :: thái hoạt động:
std::unique_ptr<Base> GetDerived3() {
auto a = std::make_unique<Derived>();
return std::move(a);
}
4) Nếu tôi tạo một phiên bản Cơ sở, cả hai đều hoạt động:
std::unique_ptr<Base> GetDerived4() {
auto a = std::make_unique<Base>();
return a;
}
std::unique_ptr<Base> GetDerived5() {
auto a = std::make_unique<Base>();
return std::move(a);
}
Tại sao (2) không thành công nhưng những người khác làm việc?
Nếu bạn cho 'Cơ sở' một trình phá hủy ảo, bạn không cần trình gỡ rối tùy chỉnh nữa. Mặt khác, –
@RemyLebeau giới thiệu một vtable mà trước đây không cần thiết, tùy thuộc vào ứng dụng, người lập trình có thể thích kích thước đối tượng nhỏ hơn không có vnable –
@MM: 'Base' và' Derived' đã có vtables do với phương thức 'hi()' ảo. Bất cứ lúc nào bạn đối phó với đa hình (chỉ hoạt động với con trỏ/tham chiếu), các lớp cơ sở phải luôn có các destructor ảo để các đối tượng có nguồn gốc có thể bị phá hủy đúng cách thông qua các con trỏ cơ bản. –