Поддерживает ли указатель this RTTI?

Я пытаюсь найти наиболее производный класс объекта в конструкторе одного из классов в его дереве наследования. Я потратил на это несколько часов и не понимаю, как еще я могу это сделать или почему это не имеет смысла. Кажется, что это имеет смысл, но отказывается работать. Я нашел множество страниц о 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, о которой раньше не знал.) Как видно из выходных данных, я могу сделать эта работа, если я избегаю использования «этого», но необходимость сделать это может показаться поломкой по замыслу.

5
задан Grault 20 June 2012 в 05:46
поделиться