#include <iostream>
#include <string>
using namespace std;
 
template <typename T> class B;     //forward declare
 
template <typename T>
class A
{
    T valuea;
public:
    A(){};
    T getValuea()
    {
        return valuea;
    }
 
    void setValuea(T x)
    {
        valuea = x;
    }
    A(const A &x)
    { 
        valuea = x.valuea; 
    }
 
    friend class B<T>;     //A<int> is a friend of B<int> 
};
 
template <typename T>
class B : A<T>
{
    T valueb;
public:
    using A<T>::setValuea;
    using A<T>::getValuea;
    B(){};
    T getValueb()
    {
        return valueb;
    }
    void setValueb(T x)
    {
        valueb = x;
    }
    B(const B &x)
    {
        valueb = x.valueb;
        this->valuea = x.valuea;
    }
};
 
struct Date
{
    int day;
    int month;
    int year;
 
    friend ostream& operator << (ostream& os, const Date& date)
    {
    	return os << "Day: " << date.day << ", Month: " << date.month << ", Year: " << date.year << " ";
    }
};
 
int main()
{
    B<float> b;
    b.setValuea(1.34);
    b.setValueb(3.14);
 
    cout << "b.setValuea(1.34): " << b.getValuea() << endl
        << "b.setValueb(3.14): " << b.getValueb() << endl;
 
    B<int> a;
    a.setValuea(1);
    a.setValueb(3);
 
    cout << "a.setValuea(1): " << a.getValuea() << endl
        << "a.setValueb(3): " << a.getValueb() << endl;
 
    B<char> y;
    y.setValuea('a');
    y.setValueb('c');
 
    cout << "y.setValuea('a'): " << y.getValuea() << endl
        << "y.setValueb('c'): " << y.getValueb() << endl;
 
    B<string> u;
    u.setValuea("good");
    u.setValueb("morning");
 
    cout << "u.setValuea(good): " << u.getValuea() << endl
        << "u.setValueb(morning): " << u.getValueb() << endl;
 
    B<Date> p;
    p.setValuea({ 27, 10, 2014 });
    p.setValueb({ 2, 11, 2014 });
 
    cout << "p.setValuea({ 27, 10, 2014 }): " << p.getValuea() << endl
         << "p.setValueb({ 2, 11, 2014 }):  " << p.getValueb() << endl;
 
 
    system("Pause");
    return 0;
}
 
 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEI7ICAgICAvL2ZvcndhcmQgZGVjbGFyZQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIEEKewogICAgVCB2YWx1ZWE7CnB1YmxpYzoKICAgIEEoKXt9OwogICAgVCBnZXRWYWx1ZWEoKQogICAgewogICAgICAgIHJldHVybiB2YWx1ZWE7CiAgICB9CgogICAgdm9pZCBzZXRWYWx1ZWEoVCB4KQogICAgewogICAgICAgIHZhbHVlYSA9IHg7CiAgICB9CiAgICBBKGNvbnN0IEEgJngpCiAgICB7IAogICAgICAgIHZhbHVlYSA9IHgudmFsdWVhOyAKICAgIH0KCiAgICBmcmllbmQgY2xhc3MgQjxUPjsgICAgIC8vQTxpbnQ+IGlzIGEgZnJpZW5kIG9mIEI8aW50PiAKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBCIDogQTxUPgp7CiAgICBUIHZhbHVlYjsKcHVibGljOgogICAgdXNpbmcgQTxUPjo6c2V0VmFsdWVhOwogICAgdXNpbmcgQTxUPjo6Z2V0VmFsdWVhOwogICAgQigpe307CiAgICBUIGdldFZhbHVlYigpCiAgICB7CiAgICAgICAgcmV0dXJuIHZhbHVlYjsKICAgIH0KICAgIHZvaWQgc2V0VmFsdWViKFQgeCkKICAgIHsKICAgICAgICB2YWx1ZWIgPSB4OwogICAgfQogICAgQihjb25zdCBCICZ4KQogICAgewogICAgICAgIHZhbHVlYiA9IHgudmFsdWViOwogICAgICAgIHRoaXMtPnZhbHVlYSA9IHgudmFsdWVhOwogICAgfQp9OwoKc3RydWN0IERhdGUKewogICAgaW50IGRheTsKICAgIGludCBtb250aDsKICAgIGludCB5ZWFyOwogICAgCiAgICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3IgPDwgKG9zdHJlYW0mIG9zLCBjb25zdCBEYXRlJiBkYXRlKQogICAgewogICAgCXJldHVybiBvcyA8PCAiRGF5OiAiIDw8IGRhdGUuZGF5IDw8ICIsIE1vbnRoOiAiIDw8IGRhdGUubW9udGggPDwgIiwgWWVhcjogIiA8PCBkYXRlLnllYXIgPDwgIiAiOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBCPGZsb2F0PiBiOwogICAgYi5zZXRWYWx1ZWEoMS4zNCk7CiAgICBiLnNldFZhbHVlYigzLjE0KTsKCiAgICBjb3V0IDw8ICJiLnNldFZhbHVlYSgxLjM0KTogIiA8PCBiLmdldFZhbHVlYSgpIDw8IGVuZGwKICAgICAgICA8PCAiYi5zZXRWYWx1ZWIoMy4xNCk6ICIgPDwgYi5nZXRWYWx1ZWIoKSA8PCBlbmRsOwoKICAgIEI8aW50PiBhOwogICAgYS5zZXRWYWx1ZWEoMSk7CiAgICBhLnNldFZhbHVlYigzKTsKCiAgICBjb3V0IDw8ICJhLnNldFZhbHVlYSgxKTogIiA8PCBhLmdldFZhbHVlYSgpIDw8IGVuZGwKICAgICAgICA8PCAiYS5zZXRWYWx1ZWIoMyk6ICIgPDwgYS5nZXRWYWx1ZWIoKSA8PCBlbmRsOwoKICAgIEI8Y2hhcj4geTsKICAgIHkuc2V0VmFsdWVhKCdhJyk7CiAgICB5LnNldFZhbHVlYignYycpOwoKICAgIGNvdXQgPDwgInkuc2V0VmFsdWVhKCdhJyk6ICIgPDwgeS5nZXRWYWx1ZWEoKSA8PCBlbmRsCiAgICAgICAgPDwgInkuc2V0VmFsdWViKCdjJyk6ICIgPDwgeS5nZXRWYWx1ZWIoKSA8PCBlbmRsOwoKICAgIEI8c3RyaW5nPiB1OwogICAgdS5zZXRWYWx1ZWEoImdvb2QiKTsKICAgIHUuc2V0VmFsdWViKCJtb3JuaW5nIik7CgogICAgY291dCA8PCAidS5zZXRWYWx1ZWEoZ29vZCk6ICIgPDwgdS5nZXRWYWx1ZWEoKSA8PCBlbmRsCiAgICAgICAgPDwgInUuc2V0VmFsdWViKG1vcm5pbmcpOiAiIDw8IHUuZ2V0VmFsdWViKCkgPDwgZW5kbDsKCiAgICBCPERhdGU+IHA7CiAgICBwLnNldFZhbHVlYSh7IDI3LCAxMCwgMjAxNCB9KTsKICAgIHAuc2V0VmFsdWViKHsgMiwgMTEsIDIwMTQgfSk7CgogICAgY291dCA8PCAicC5zZXRWYWx1ZWEoeyAyNywgMTAsIDIwMTQgfSk6ICIgPDwgcC5nZXRWYWx1ZWEoKSA8PCBlbmRsCiAgICAgICAgIDw8ICJwLnNldFZhbHVlYih7IDIsIDExLCAyMDE0IH0pOiAgIiA8PCBwLmdldFZhbHVlYigpIDw8IGVuZGw7CgoKICAgIHN5c3RlbSgiUGF1c2UiKTsKICAgIHJldHVybiAwOwp9Cgo=
				
				
				
				
				
			 
			
				
			
			
				
	
		
		
	
	
		b.setValuea(1.34): 1.34
b.setValueb(3.14): 3.14
a.setValuea(1): 1
a.setValueb(3): 3
y.setValuea('a'): a
y.setValueb('c'): c
u.setValuea(good): good
u.setValueb(morning): morning
p.setValuea({ 27, 10, 2014 }): Day: 27, Month: 10, Year: 2014 
p.setValueb({ 2, 11, 2014 }):  Day: 2, Month: 11, Year: 2014