Проблема в SpecializedTreeParser2 _2;
. TreeParser leftChild
и
rightChild
инициализируются нормально, печатается их id
. Проверьте вывод
О, радость неопределенного поведения ...
Нет, TreeParser leftChild
и rightChild
не инициализируются нормально, и проблема не в SpecializedTreeParser2 _2
.
Проблема в том, что TreeNode::left;
и TreeNode* right;
используются неинициализированными. Это приводит к тому, что ваша программа имеет неопределенное поведение, а красота неопределенного поведения заключается в том, что вся программа имеет неопределенное поведение, а не только использование неинициализированных переменных. Это означает, что хотя SpecializedTreeParser1 _1
кажется, что все в порядке, на самом деле это не так. Вывод, который вы видите - это поведение с неопределенным поведением. Нет смысла анализировать, откуда он взялся, почему _1
работает, а _2
- нет. Это неопределенное поведение. Исправьте это и не пытайтесь понять, почему это специфическое поведение.
Позвольте мне показать вам, что я имею в виду на более коротком примере:
int main()
{
int a = 24;
std::cout << a << std::endl;
int b; // uninitialized
std::cout << b << std::endl; // <-- this line makes the WHOLE program to have UB
}
Теперь, каковы возможные варианты поведения вышеуказанной программы?
print "24"
print <garbage>
можно и разумно ожидать
print "24"
print "0"
также возможно
print "24"
<crash>
тоже не удивительно
print <garbage>
print "24"
также возможно ... подождите что? Да!! Неопределенная природа программы не должна проявляться в строке std::cout << b << std::endl
. Все выполнение программы не определено. Все что угодно может случиться!
Все это также возможно:
<crash>
print "0"
print "0"
print "24"
print "24"
print "24"
print "0"
<crash>
print "Here be dragons"