Tôi đã gặp phải một chút vấn đề phức tạp trong một số mã C++, được mô tả dễ dàng nhất bằng mã. Tôi có các lớp học giống như:Ghi đè biến thành viên trong C++
class MyVarBase
{
}
class MyVar : public MyVarBase
{
int Foo();
}
class MyBase
{
public:
MyBase(MyVarBase* v) : m_var(v) {}
virtual MyVarBase* GetVar() { return m_var; }
private:
MyVarBase* m_var;
}
Tôi cũng có một lớp con của MyBase cần có thành viên MyVar loại vì cần gọi Foo. Di chuyển hàm Foo vào MyVarBase không phải là một tùy chọn. Có ý nghĩa không khi thực hiện việc này:
Điều này dường như hoạt động nhưng trông rất tệ và tôi không chắc liệu nó có gây rò rỉ bộ nhớ hay phá vỡ trình tạo bản sao hay không. Các tùy chọn khác của tôi có thể là đặt tên biến MyVar trong MyClass một cái gì đó khác nhưng có nó bằng với con trỏ m_var trong cơ sở, hoặc để templatise MyBase trên kiểu MyVar.
Tất cả các tùy chọn này không có vẻ lý tưởng vì vậy tôi muốn biết liệu có ai khác đã gặp phải tình huống như thế này không và liệu có cách nào tốt để làm cho nó hoạt động không.
Tôi sẽ sử dụng dynamic_cast <> chứ không phải static_cast <> trong trường hợp này. Tôi nghĩ rằng nó nắm bắt được ý định tốt hơn. – coryan
Không chỉ vậy, nhưng sự trở lại của dynamic_cast <> sẽ trả về null nếu v không phải là MyVar. – KeithB
không có coryan. dynamic_cast sẽ tệ hơn. vì độc giả nghĩ GetVar có thể trả lại MyVarBase, điều này sẽ sai –