Otóż, wklejam mocno przycięty kod. Wiem, że sporo go jest, ale jest dość prosty więc Od razu dziękuję za wytrwałość temu kto pomoże.

Output:

W Funkcji search:
Name: zmiana2d
Parameter_a : 5
Parameter_d : 6

adres rzutowanie: 00AFFC50
adres result: 00AFFC50

main:
adres obj2: 00AFFC50
adres s_r: 00AFFB04

Problem:
Program wykrzacza się po "s_r->info" bo s_r nie wskazuje na obj2. Funkcja search_recurs znajduje mi odpowiedni wskaznik i ma zwracac result. Jak widac znajduje dobry wskaznik bo result wskazuje na obj2. JEDNAK cos sie dzieje przy return result bo s_r (gdzie s_r=search_recurs (zwraca result)) juz nie wskazuje na ten sam obiekt co wskaznik result, ktory mial byc przekazany z funkcji search.


#include "stdafx.h"

using namespace std;


class Node {
private:

public:
	string name;
	Node *parent;
	vector <Node*> children;


	Node() { name = "noname", parent = NULL; }

	Node(string _name) { name = _name, parent = NULL; }

	Node(Node *_parent) { parent = _parent; }

	Node(string _name, Node *_parent) { name = _name, parent = _parent; }

	Node(Node *_parent, vector <Node*> _children) { parent = _parent, children = _children; }

	Node(string _name, Node *_parent, vector <Node*> _children) { name = _name, parent = _parent, children = _children; }

	virtual ~Node() { cout << "Base Destructor called\n"; }


	void add_parent(Node *wsk) {
		parent = wsk;
	}

	void add_children(Node *child) {
		children.push_back(child);
	}

	void info_node() {
		cout << "Name: " << name << endl;
		cout << "Address: " << this << endl;
		cout << "Parent: " << parent << endl;
	}

};


class A { 
private:
	string name;
	int parameter_a;
protected:

	A() { name = "untitled"; parameter_a = 1; }
	A(string _name) { name = _name, parameter_a = 1; }
	A(string _name, int _parameter_a) : name(_name), parameter_a(_parameter_a) {};

	string info_name() {
		return name;
	}

	int info_parameter_a()
	{
		return parameter_a;
	}

public:

	char info_type() {
		return 'A';
	}

	friend class Leaf;
	friend A* search_recurs_node(Node* root, string name);
	virtual void info() = 0;
};


class Leaf : public Node { 
private:

public:
	vector<A*> objects;
	Leaf() { name = "noname", parent = NULL; }

	Leaf(string _name) { name = _name, parent = NULL; }

	Leaf(Node *_parent) { parent = _parent; }

	Leaf(string _name, Node *_parent) { name = _name, parent = _parent; }

	Leaf(Node *_parent, vector <Node*> _children) { parent = _parent, children = _children; }

	Leaf(string _name, Node *_parent, vector <Node*> _children) { name = _name, parent = _parent, children = _children; }

	void add_objects_leaf(A* obj) {
		objects.push_back(obj);
	}

};


class X : public A, public Leaf {
private:
	int parameter_x;
public:
	X() : A("dziedziczone_w_X_z_A", 98), parameter_x(99) {};
	X(string _name_x, int _parameter_a, int _parameter_x) : A(_name_x, _parameter_a), parameter_x(_parameter_x) {};


	char info_type() {
		return 'X';
	}


	void info() {
		cout << "Name: " << A::info_name() << endl;
		cout << "Parameter_a : " << A::info_parameter_a() << endl;
		cout << "Parameter_d : " << parameter_x << endl;
	}



};



A* search_recurs_node(Node* root, string name) {


	A* result;
	Leaf* rzutowanie;

	if ((root->children.size()) > 0) {
		for (int i = 0; i < (root->children.size()); ++i) {

			search_recurs_node(root->children[i], name);

		}
	}
	else if (rzutowanie = dynamic_cast<Leaf*>(root)) {
		for (int i = 0; i < rzutowanie->objects.size();++i) {
			if (rzutowanie->objects[i]->info_name() == name) {
				cout << "W Funkcji search: " << endl;
				rzutowanie->objects[i]->info();
				cout << endl << "adres rzutowanie: " << rzutowanie->objects[i] << endl;
				result = (rzutowanie->objects[i]);
				cout << "adres result: " << result << endl;
				cout << endl;
				return result;
			}
		}
	}


	//return NULL;

};

int main()
{
	//

	Node A_node("node_A");
	Leaf X_node("node_X", &A_node);

	A_node.add_children(&X_node);

	X obj1("name d1", 1, 2), obj2("zmiana2d", 5, 6);

	X_node.add_objects_leaf(&obj1);
	X_node.add_objects_leaf(&obj2);


	A* s_r;
	s_r = search_recurs_node(&A_node, "zmiana2d");

	cout << "main: " << endl;
	cout << "adres obj2: " << &obj2 << endl;
	cout << "adres s_r: " << s_r << endl;

	s_r->info();

	cout << endl << "Fuck VS2015" << endl;

	return 0;
}
#pragma once

#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <cstdlib>