#include <iostream>
#include <sstream>
#include <string>

class Foo {
public:
    Foo() { format_string(); }
    Foo(int a) { format_string(a); }

    void print() { std::cout << str; }
    
protected:
	std::string str;
	
	void format_string(int a = 0)
	{
		std::stringstream stream;
		stream << "{a: " << a << "}\n";
		str = stream.str();
	}
};

class Bar : public Foo {
public:
    Bar() { format_string(); }
    Bar(int a, int b) { format_string(a, b); }
    
protected:
	void format_string(int a = 0, int b = 0)
	{
		std::stringstream stream;
		stream << "{a: " << a << ", b: " << b << "}\n";
		str = stream.str();
	}
};

int main() {
    Foo t1 = Bar(10,10);
    Bar t2 = Bar(20,20);
    Foo *t3 = new Bar(30,30);
    Foo t4 = Bar(10, 20);
    t1.print();
    t2.print();
    t3->print();
    t4.print();
    delete t3;
    return 0;
}