Tôi đang cố gắng khám phá lớp có nguồn gốc xuất phát nhất của một đối tượng, bên trong một hàm tạo của một trong các lớp trong cây thừa kế của nó. Tôi đã dành vài giờ vào việc này ngay bây giờ và đang thua lỗ vì làm cách nào khác tôi có thể làm điều đó hoặc tại sao nó không có ý nghĩa. Nó có vẻ có ý nghĩa hoàn hảo, nhưng nó từ chối làm việc. Tôi đã tìm thấy rất nhiều trang về RTTI và về cơ bản không có nơi nào với chúng. Tôi sẽ tiếp tục giải thích sau khi trường hợp thử nghiệm của tôi và đầu ra của nó.Con trỏ "này" có được bật RTTI không?
Nguồn:
#include <iostream>
#include <typeinfo>
#include <string>
class A
{
public:
A(std::string foo);
virtual void bar(A* a) = 0;
};
class B : public A
{
public:
B();
virtual void bar(A* a);
};
A::A(std::string foo)
{
std::cout << "type as passed to A constructor: " << foo << " (" << this << ")" << std::endl;
std::cout << "type as determined in A constructor: " << typeid(*this).name() << " (" << this << ")" << std::endl;
}
B::B() : A(typeid(*this).name())
{
A* a = (A*)this;
std::cout << "type as determined in B constructor: " << typeid(*a).name() << " (" << this << ")" << std::endl;
this->bar(this);
}
void B::bar(A* a)
{
std::cout << "type as determined in bar: " << typeid(*a).name() << " (" << a << ")" << std::endl;
}
int main()
{
B b;
b.bar(&b);
return 0;
}
Sản lượng (trên g ++):
type as passed to A constructor: 1B (0x7fff5fbff910)
type as determined in A constructor: 1A (0x7fff5fbff910)
type as determined in B constructor: 1B (0x7fff5fbff910)
type as determined in bar: 1B (0x7fff5fbff910)
type as determined in bar: 1B (0x7fff5fbff910)
Tôi đang cố gắng để có được dòng thứ hai của đầu ra để nói "1B" thay vì "1A" . RTTI có bị loại bỏ khỏi "điều này" vì một lý do nào đó mà tôi chưa thể tưởng tượng? Làm thế nào mà không phá vỡ ý tưởng của các chức năng ảo? (Tôi đã thực hiện điều này với các chức năng ảo cho đến khi tôi phát hiện ra tôi đã thực hiện lại một phần của RTTI mà trước đây tôi chưa từng biết đến). để làm điều đó có vẻ như vỡ bằng thiết kế.
tại sao bạn đang cố gắng phát hiện loại? đó là không tốt. điều này nghe giống như một giải pháp (thiếu sót) đã cố gắng cho một thứ khác, cái gì đó khác? –
Alf, tôi đã std :: bản đồ của các loại (std :: strings, trong trường hợp này) cho các đối tượng, với mỗi loại có một đối tượng duy nhất trong bản đồ. Mỗi cá thể của một lớp nhất định có bản đồ riêng của nó, để cho phép các đối tượng mới có thể dễ dàng được thêm vào các đối tượng cốt lõi này và sau đó được truy lục theo loại. (Tôi đã làm điều này với const int và một trang web của các phương pháp ảo trước khi tôi biết RTTI, với thất bại tương đương cho cùng một lý do.) – Grault