継承ツリーのクラスの1つのコンストラクター内で、オブジェクトの最も派生したクラスを見つけようとしています。私は今これに数時間を費やしましたが、他にどのようにそれを行うことができるのか、なぜそれが意味をなさないのかについて途方に暮れています。それは完全に理にかなっているようですが、それでも機能しません。私は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)
出力の2行目に、「1A」ではなく「1B」と表示させようとしています。まだ想像できない理由で、RTTIは「これ」から削除されていますか?それが仮想関数の概念を壊さないようにするにはどうすればよいでしょうか。(これまで知らなかったRTTIの一部を再実装していることに気付くまで、これを仮想関数で実装していました。)出力が示すように、「this」の使用を避ければ、これを機能させることができますが、設計上、破損しているように見えます。