I am trying to do something I thought was simple: calling functions that call functions that call functions (from inherited classes) using a chain of pointers. Is there a better way of accomplishing this? Also, in the spirit of C++11, how would I incorporate smart pointers in this example? This example crashes the application:
Here is the sample code, apologies if it looks a little silly:
Actual output (Crashes!):
    almost there...
Desired output:
    almost there...
    hello from function1
f1.h:
    #ifndef FUNCTION_1_H
    #define FUNCTION_1_H
    //f1.h (header file)
    #include <iostream>
    struct f1{
    int _a;
    f1() {}
    void function1();
    };
    #endif
f2.h:
    #ifndef FUNCTION_2_H
    #define FUNCTION_2_H
    //f2.h (header file) 
    #include "f1.h"
    struct f2 : public f1{
    int _b;
    f1* f1_ptr;
    f2() :f1(){}
    void function2();
    };
    #endif
f3.h:
    #ifndef FUNCTION_3_H
    #define FUNCTION_3_H
    #include "f2.h"
    struct f3 :public f2{
    int _c;
    f2* f2_ptr;
    f3() : f2(){}
    void function3();
    };
    #endif
CPPs:
f3.cpp:
    #include "f3.h"
    void f3::function3(){
    //do stuff...
    //e.g. calculate an int Var3
    f2_ptr->function2(/*pass Var3 as argument*/);
    }
f2.cpp:
    #include "f2.h"
    void f2::function2(/*receive Var3*/){
    //do stuff with Var3
    //e.g. maybe use Var3 to calculate an int Var2
    std::cout << "almost there..." << std::endl;
    f1_ptr->function1(/*pass Var2 as argument*/);
    }
f1.cpp:
    #include "f1.h"
    void f1::function1(/*receive Var2*/){
    //take Var2 and use elsewhere
    //or continue linking to other functions
    std::cout << "hello from function1" << std::endl;
    }
main.cpp:
    int main(){
    f3* ptr3 = new f3;
    ptr3->function3();
    //delete ptr3;
    std::cin.get();
    return 0;
    }
 
     
     
    