Vì tất cả chức năng ảo trong C++ đều được lưu trong bảng V. Overiding diễn ra trong trường hợp chức năng ảo. Tôi muốn hỏi có bất kỳ cách nào mà chúng ta có thể gọi hàm ảo trực tiếp từ bảng và có thể quá xác định những gì hàm V-bảng chứa.Gọi chức năng ảo từ bảng V
Trả lời
Thực ra bạn có thể. Tôi không quan tâm về tính di động, nhưng trong VS bạn có thể làm điều đó. Giả sử rằng chúng tôi đang xây dựng mã 32 bit với VS, 4 byte đầu tiên tại địa chỉ đối tượng là địa chỉ vtable. Bằng cách xem các tệp tiêu đề, chúng ta biết thứ tự các phương thức trong vtable.
Ví dụ:
class Base
{
public:
virtual void printMessage()
{
std::cout << "Base::printMessage()" << std::endl;
}
};
class Derived : public Base
{
public:
void printMessage()
{
std::cout << "Derived::printMessage()" << std::endl;
}
};
int main(int argc, char* argv[])
{
Derived d;
unsigned int vtblAddress = *(unsigned int*)&d;
typedef void(*pFun)(void*);
pFun printFun = (pFun)(*(unsigned int*)(vtblAddress));
printFun(&d);
return 0;
}
T.B. Tôi sẽ không hỏi tại sao bạn làm điều đó, nhưng ở đây bạn có một tùy chọn :-)
điều này thực sự là tôi muốn. –
Không thể tin được, Peter Wood, Eelke, toro2k, Stony và quetzalcoatl không thể biết được những gì đang được hỏi ở đây. Làm thế nào để mọi người tham gia trong chủ đề này hiểu những gì đang được hỏi? 5 "Smart" guys với danh tiếng khá thấp so với Mike Seymour và ForEveR đang vặn vẹo mọi người khác. Ý tôi là, bạn không hiểu câu hỏi, điều đó là tốt, nhưng hãy để những người khác thảo luận về nó vì lợi ích của chúa ... – user1764961
@ user1764961- yaa người đàn ông thực sự không thể tin nổi !! –
Không đảm bảo theo tiêu chuẩn, các chức năng ảo được triển khai bằng cách sử dụng v-table
. Vì vậy, chỉ khi bạn chắc chắn, trình biên dịch đó sử dụng v-table
- bạn có thể tìm thấy bù đắp cần thiết.
Trong c + + là nó không cần thiết mà trình biên dịch sẽ sử dụng V-bảng để thực hiện chức năng ảo? –
@ user2484070 có, không cần thiết. Việc thực hiện các hàm ảo phụ thuộc vào trình biên dịch. – ForEveR
@ user2484070, các giá trị sẽ được lưu trữ ở đâu đó và bằng cách nào đó, đó là chắc chắn. Nó sẽ là một cái bàn V nổi tiếng hay cái gì đó khác ... không thực sự quan trọng. – user1764961
Có thể, không. Ngôn ngữ không chỉ định cách gửi công văn ảo, chỉ cách nó hoạt động. Nó không nhất thiết phải được thực hiện bằng cách sử dụng một bảng v, và không có cách nào để truy cập một chức năng ảo ngoại trừ việc gọi nó.
Nếu bạn chỉ cần hỗ trợ một ABI cụ thể, bạn có thể sử dụng chi tiết triển khai, cùng với một số phôi con trỏ tinh tế, để ánh xạ đối tượng tới con trỏ hàm theo cùng cách mà cơ chế gửi đi ảo thực hiện. Nhưng bạn sẽ bước ra ngoài ngôn ngữ được xác định vào lãnh thổ không được hỗ trợ, không di động, vì vậy tôi chắc chắn sẽ khuyên bạn nên suy nghĩ lại những gì bạn đang cố gắng làm.
hiểu rồi. cảm ơn :) –
Tôi muốn nói không nói chung, bởi vì việc triển khai chính xác vtable là một nền tảng/trình biên dịch cụ thể. Nếu bạn biết làm thế nào nền tảng/trình biên dịch thực hiện vtable và addresation, nó có thể có thể tính toán nó bằng cách xác định địa chỉ của vtable cho một lớp cụ thể và sau đó thêm một offset của một phương thức ảo.
Vtable chứa tất cả các phương thức ảo cho lớp. Bạn có thể tháo rời ứng dụng để xem chúng.
- 1. C++ nhớ bảng chức năng ảo tốn
- 2. Gọi chức năng ảo thuần túy từ chức năng thành viên lớp cơ sở trừu tượng?
- 3. chức năng ảo const vs chức năng ảo không const
- 4. Gọi chức năng ghi đè từ chức năng ghi đè
- 5. C++: Các chức năng ảo cần gọi cùng một mã?
- 6. Chức năng ảo thuần túy được gọi là
- 7. Chức năng ảo thuần túy được gọi là lỗi
- 8. C++ chức năng ảo không được gọi trong lớp con
- 9. C++ ảo Const Chức năng
- 10. Force gọi lớp cơ sở chức năng ảo
- 11. Thừa kế chức năng ảo
- 12. Cần gọi chức năng gốc từ chức năng bị ngắt
- 13. chức năng ảo nội tuyến
- 14. Sự khác biệt giữa việc gọi hàm ảo và chức năng ảo không?
- 15. Biến tham chiếu và chức năng ảo
- 16. Chức năng ảo có thể bị ghi đè bởi một chức năng phi ảo không?
- 17. Câu hỏi với các chức năng ảo
- 18. Chức năng ảo Mimic (thuần) ảo như C#
- 19. gọi c chức năng từ C#
- 20. Gọi chức năng Javascript từ Silverlight
- 21. Chức năng gọi từ một đối tượng?
- 22. Gọi chức năng JQuery từ GWT
- 23. Góc: chức năng gọi từ màn hình
- 24. gọi chức năng Jquery từ javascript
- 25. Gọi PHP chức năng từ cành mẫu
- 26. Cách gọi chức năng C++ từ java
- 27. Gọi hai chức năng từ cùng onclick
- 28. Gọi chức năng Matlab từ python
- 29. Quá tải chức năng ảo tinh khiết
- 30. Xóa chức năng ảo trong C++ 0x
Tại sao một người muốn làm điều đó? Ít nhất bạn có thể (sử dụng một số địa chỉ bộ nhớ trực tiếp), miễn là bạn biết về nội tại của trình biên dịch ABI của bạn. –
chúng ta có thể làm gì đó với V-con trỏ có trong Class (nếu lớp chứa các hàm ảo) trỏ đến v-table.using g ++ compiler, tôi đã thử với con trỏ V nhưng nó không hoạt động. –