Я пытаюсь найти наиболее производный класс объекта в конструкторе одного из классов в его дереве наследования. Я потратил на это несколько часов и не понимаю, как еще я могу это сделать или почему это не имеет смысла. Кажется, что это имеет смысл, но отказывается работать. Я нашел множество страниц о RTTI и практически ничего с ними не сделал. Я продолжу объяснять после своего тестового примера и его результатов.
Источник:
#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;
}
Вывод (на 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)
Я пытаюсь заставить вторую строку вывода говорить "1B" вместо "1A". Является ли RTTI отделенным от "этого" по какой-то причине, которую я пока не могу себе представить? Как это не разрушает идею виртуальных функций? (Я реализовал это с помощью виртуальных функций, пока не обнаружил, что заново реализую часть RTTI, о которой раньше не знал.) Как видно из выходных данных, я могу сделать эта работа, если я избегаю использования «этого», но необходимость сделать это может показаться поломкой по замыслу.