Мой базовый класс, class Foo
, является шаблоном класса, который имеет следующий конструктор:
//Declarations
template <class T>
class Foo
{
public:
Foo::Foo(std::string& root);
MemberClass obj;
}
template <class T>
Foo<T>::Foo(std::string& root)
{
MemberClass obj(root); // initialize the member object
obj.getRoot(); // Prints the string
// ...
}
У него есть дочерний класс, который построен следующим образом:
template <class T>
Bar<T>::Bar(std::string& root)
: Foo<T>(root)
{
//...
}
template<class T>
void
Bar<T>::accessObj()
{
this->obj.getRoot();
// Prints the empty string
}
Это дает неожиданное поведение, даже если ошибки не генерируются. В этом случае getRoot()
вернет пустую строку.
Я проверил это, изменив конструктор Foo
следующим образом:
{
MemberClass obj(root);
std::cout << &obj << std::endl;
}
и конструктор Bar
примерно так:
//...
: Foo<T>(root)
{
std::cout << &this->obj << std::endl;
}
Вывод дает два разных места в памяти, что полностью поражает меня. Почему это так? Как мне это исправить?