#include <iostream>
using namespace std;
template <class T>
class Exponentiation
{
public:
Exponentiation() {};
virtual ~Exponentiation() {};
// computes C = A^n
virtual void power() = 0;
};
template <class T>
class ExpA : public Exponentiation<T>
{
public:
ExpA() {};
~ExpA() {};
void power () override { cout<<"power A\n"; }
};
template <class T>
class ExpB : public Exponentiation<T>
{
protected:
//var1;
//var2;
public:
ExpB() {};
~ExpB() {};
void func1(){ cout<<"f1\n"; }
void func2(){ cout<<"f2\n"; }
void power () override { cout<<"power B\n"; };
};
template <class T, template <class U> class Exp>
void performExp(Exp<T>& obj)
{
obj.power();
}
template <class T>
void performExp(ExpB<T>& obj)
{
obj.func1();
obj.func2();
obj.power();
}
int main() {
ExpA<long> a;
performExp(a);
ExpB<long> b;
performExp(b);
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIEV4cG9uZW50aWF0aW9uCnsKICAgIHB1YmxpYzoKICAgIEV4cG9uZW50aWF0aW9uKCkge307CiAgICB2aXJ0dWFsIH5FeHBvbmVudGlhdGlvbigpIHt9OwoKICAgIC8vIGNvbXB1dGVzIEMgPSBBXm4KICAgIHZpcnR1YWwgdm9pZCBwb3dlcigpID0gMDsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBFeHBBIDogcHVibGljIEV4cG9uZW50aWF0aW9uPFQ+CnsKICAgIHB1YmxpYzoKICAgIEV4cEEoKSB7fTsKICAgIH5FeHBBKCkge307CgogICAgdm9pZCBwb3dlciAoKSBvdmVycmlkZSB7IGNvdXQ8PCJwb3dlciBBXG4iOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgRXhwQiA6IHB1YmxpYyBFeHBvbmVudGlhdGlvbjxUPgp7CiAgICBwcm90ZWN0ZWQ6CiAgICAvL3ZhcjE7CiAgICAvL3ZhcjI7CgogICAgcHVibGljOgogICAgRXhwQigpIHt9OwogICAgfkV4cEIoKSB7fTsKCiAgICB2b2lkIGZ1bmMxKCl7IGNvdXQ8PCJmMVxuIjsgfQogICAgdm9pZCBmdW5jMigpeyBjb3V0PDwiZjJcbiI7IH0KICAgIHZvaWQgcG93ZXIgKCkgb3ZlcnJpZGUgeyBjb3V0PDwicG93ZXIgQlxuIjsgfTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBULCB0ZW1wbGF0ZSA8Y2xhc3MgVT4gY2xhc3MgRXhwPgp2b2lkIHBlcmZvcm1FeHAoRXhwPFQ+JiBvYmopCnsKICAgICBvYmoucG93ZXIoKTsKfQp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kdm9pZCBwZXJmb3JtRXhwKEV4cEI8VD4mIG9iaikKewogICAgIG9iai5mdW5jMSgpOwogICAgIG9iai5mdW5jMigpOyAKICAgICBvYmoucG93ZXIoKTsKfQoKaW50IG1haW4oKSB7CglFeHBBPGxvbmc+IGE7CglwZXJmb3JtRXhwKGEpOwoJCglFeHBCPGxvbmc+IGI7IAoJcGVyZm9ybUV4cChiKTsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXJldHVybiAwOwp9