class Base
{
public:
int base_int;
};
class Derived : public Base
{
public:
int derived_int;
};
Base* basepointer = new Derived();
basepointer-> //Access derived_int here, is it possible? If so, then how?
Trả lời
Không, bạn không thể truy cập derived_int
vì derived_int
là một phần của Derived
, trong khi basepointer
là một con trỏ đến Base
.
Bạn có thể làm điều đó theo chiều ngược lại mặc dù:
Derived* derivedpointer = new Derived;
derivedpointer->base_int; // You can access this just fine
lớp Derived kế thừa các thành viên của lớp cơ sở, không phải là cách khác xung quanh.
Tuy nhiên, nếu basepointer
của bạn đã được trỏ đến một thể hiện của Derived
sau đó bạn có thể truy cập nó thông qua một dàn diễn viên:
Base* basepointer = new Derived;
static_cast<Derived*>(basepointer)->derived_int; // Can now access, because we have a derived pointer
Lưu ý rằng bạn sẽ cần phải thay đổi kế thừa của bạn để public
đầu tiên:
class Derived : public Base
không nên sử dụng dynamic_cast thay vì static_cast? –
Điều đó tùy thuộc vào việc anh ta có biết rằng đó là một 'Có nguồn gốc' hay không. Nếu bạn chắc chắn 100% (như chúng ta đang ở đây) thì 'static_cast' là tốt. –
không phải ai cũng có nghĩa là reinterpret_cast thay vì static_cast? Tôi khá chắc chắn static_cast sẽ không biên dịch. – Balk
Bạn đang nhảy múa trên bãi mìn ở đây. Các lớp cơ sở không bao giờ có thể biết rằng nó thực sự là một thể hiện của nguồn gốc. Cách an toàn nhất để làm điều đó sẽ được giới thiệu một hàm ảo trong cơ sở:
class Base
{
protected:
virtual int &GetInt()
{
//Die horribly
}
public:
int base_int;
};
class Derived : Base
{
int &GetInt()
{
return derived_int;
}
public:
int derived_int
};
basepointer->GetInt() = 0;
Nếu điểm basepointer như một cái gì đó khác mà một nguồn gốc, chương trình của bạn sẽ chết khủng khiếp, đó là kết quả mong muốn.
Hoặc, bạn có thể sử dụng dynamic_cast (basepointer). Nhưng bạn cần ít nhất một hàm ảo trong Base cho nó, và được chuẩn bị để gặp một số không.
static_cast <>, như một số gợi ý, là cách chắc chắn để tự chụp chân mình. Đừng đóng góp vào bộ nhớ cache khổng lồ về "câu chuyện kinh dị của gia đình ngôn ngữ C".
"Ngoài ra, bạn có thể sử dụng dynamic_cast (basepointer). Nhưng bạn cần ít nhất một hàm ảo trong Base cho điều đó, và được chuẩn bị để gặp phải một số không." -> Good Point Seva.Liked It :) – mahesh
Sử dụng 'static_cast' không phải là cách để tự bắn mình vào chân. Tôi nghĩ rằng bạn đang bối rối với ký hiệu cast rõ ràng của C '(T) x'. 'static_cast' mặt khác là loại an toàn, nhưng' dynamic_cast' sẽ trả về một con trỏ null nếu nó không thể chuyển đổi trong khi 'static_cast' sẽ phát hành một lỗi trình biên dịch. – 0x499602D2
bạn có thể sử dụng CRTP
về cơ bản bạn sử dụng các lớp có nguồn gốc trong các mẫu cho các lớp cơ sở
Có thể bằng cách cho phép các lớp cơ sở biết loại lớp dẫn xuất. Điều này có thể được thực hiện bằng cách làm cho lớp cơ sở là một mẫu của kiểu dẫn xuất. Thành ngữ C++ này được gọi là curiously recurring template pattern.
Hiểu biết về lớp dẫn xuất, con trỏ lớp cơ sở có thể được đúc tĩnh thành con trỏ đến kiểu dẫn xuất.
template<typename DerivedT>
class Base
{
public:
int accessDerivedField()
{
auto derived = static_cast<DerivedT*>(this);
return derived->field;
}
};
class Derived : public Base<Derived>
{
public:
int field;
};
int main()
{
auto obj = new Derived;
obj->accessDerivedField();
}
// nếu bạn biết những gì có nguồn gốc lớp học mà bạn sẽ sử dụng
Derived * derivedpointer = dynamic_cast < Derived *> basepointer;
// thì bạn có thể truy cập lớp dẫn xuất bằng cách sử dụng derivedpointer
- 1. Truy cập các thành viên lớp dẫn xuất bằng một con trỏ lớp cơ sở
- 2. Chuyển đổi con trỏ thành con trỏ giữa các lớp gốc và cơ sở?
- 3. Truy cập các thành viên lớp trên con trỏ NULL
- 4. nguyên cảo truy cập thành viên của lớp cơ sở
- 5. C++: cú pháp để truy cập cấu trúc thành viên từ con trỏ đến lớp
- 6. Làm thế nào để đăng ký con trỏ hàm thành viên lớp cơ sở với lớp cơ sở
- 7. Lớp con trỏ hàm thành viên
- 8. C++ con trỏ đối tượng lớp và các hàm thành viên truy cập vào
- 9. C++ tham khảo lớp cơ sở khởi với đối tượng khác nhau có nguồn gốc lớp
- 10. Con trỏ tới mảng lớp cơ sở, với lớp bắt nguồn
- 11. Tại sao tôi có thể truy cập một hàm thành viên riêng có nguồn gốc thông qua một con trỏ lớp cơ sở đến một đối tượng có nguồn gốc?
- 12. cách lấy tên lớp có nguồn gốc từ lớp cơ sở
- 13. Gọi định nghĩa lớp cơ sở của hàm thành viên ảo với con trỏ hàm
- 14. chuyển đổi từ nguồn gốc * thành cơ sở * tồn tại nhưng không thể truy cập được
- 15. XmlSerializer lỗi constructor với lớp có nguồn gốc từ một lớp cơ sở
- 16. Gọi một constructor lớp cơ sở từ lớp có nguồn gốc trong Java
- 17. Gọi phương thức ảo từ lớp cơ sở trên đối tượng có nguồn gốc
- 18. Thừa kế: Truy cập vào các lớp cơ sở từ một lớp con
- 19. Thành phần dữ liệu lớp mẫu cơ sở không hiển thị trong lớp mẫu có nguồn gốc?
- 20. Cast cơ sở dụ để lớp có nguồn gốc (nhìn xuống) trong C#
- 21. Xóa một đối tượng có nguồn gốc thông qua một con trỏ tới lớp cơ sở của nó
- 22. Truy cập các thành viên lớp C# trong IronPython
- 23. biến thành viên Sử dụng kế thừa từ một lớp cơ sở templated (C++)
- 24. Truy cập thuộc tính của lớp dẫn xuất từ lớp cơ sở trong C#
- 25. Đa hình: Bắt nguồn từ một thành viên được bảo vệ trong một lớp cơ sở?
- 26. Truy cập các biến tĩnh lớp con từ lớp cha?
- 27. mẫu cơ sở lớp typedef thành viên vô hình
- 28. Có an toàn để "upcast" một con trỏ phương pháp và sử dụng nó với con trỏ lớp cơ sở?
- 29. Về sizeof của một hàm thành viên lớp con trỏ
- 30. Khả năng truy cập không phù hợp: lớp cơ sở ít truy cập hơn lớp
Bạn có thực sự muốn sử dụng kế thừa riêng không? –
Ai đó thêm một người kết thúc câu lệnh vào nó. Tôi chỉ thay đổi một ký tự. –