#include <iostream>
#include <chrono>
#include <memory>
using namespace std;
using namespace std::chrono;
enum class TYPE {base, child};
class Base {
int n;
protected: Base(int _n) : n(_n) {}
public: virtual TYPE getType(){ return TYPE::base; }
};
class Child: public Base {
int m;
public:
TYPE getType(){ return TYPE::child; }
Child(int _n, int _m) : Base(_n), m(_m) {}
};
int main() {
unique_ptr<Base> b = make_unique<Child>(6, 7);
TYPE tB = TYPE::base;
TYPE tC = TYPE::child;
{
auto t1 = high_resolution_clock::now();
for(auto i = 0; i < 1000000000; ++i){
auto res = b->Base::getType();
}
std::cout << (tB == b->Base::getType()) << ", ";
auto t2 = high_resolution_clock::now();
auto duration = duration_cast<microseconds>( t2 - t1 ).count();
cout << "Duration: " << duration << std::endl;
}
{
auto t1 = high_resolution_clock::now();
for(auto i = 0; i < 1000000000; ++i){
auto res = b->getType();
}
std::cout << (tC == b->getType()) << ", ";
auto t2 = high_resolution_clock::now();
auto duration = duration_cast<microseconds>( t2 - t1 ).count();
cout << "Duration: " << duration << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8bWVtb3J5PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOwoKZW51bSBjbGFzcyBUWVBFIHtiYXNlLCBjaGlsZH07CgpjbGFzcyBCYXNlIHsKCWludCBuOwogIHByb3RlY3RlZDogQmFzZShpbnQgX24pIDogbihfbikge30KICBwdWJsaWM6IHZpcnR1YWwgVFlQRSBnZXRUeXBlKCl7IHJldHVybiBUWVBFOjpiYXNlOyB9Cn07CgpjbGFzcyBDaGlsZDogcHVibGljIEJhc2UgewoJaW50IG07CiAgcHVibGljOgogICAgVFlQRSBnZXRUeXBlKCl7IHJldHVybiBUWVBFOjpjaGlsZDsgfQogICAgQ2hpbGQoaW50IF9uLCBpbnQgX20pIDogQmFzZShfbiksIG0oX20pIHt9Cn07CgppbnQgbWFpbigpIHsKCXVuaXF1ZV9wdHI8QmFzZT4gYiA9IG1ha2VfdW5pcXVlPENoaWxkPig2LCA3KTsKCVRZUEUgdEIgPSBUWVBFOjpiYXNlOwoJVFlQRSB0QyA9IFRZUEU6OmNoaWxkOwoJCgl7CgkJYXV0byB0MSA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CgkJZm9yKGF1dG8gaSA9IDA7IGkgPCAxMDAwMDAwMDAwOyArK2kpewoJCQlhdXRvIHJlcyA9IGItPkJhc2U6OmdldFR5cGUoKTsKCQl9CgkJc3RkOjpjb3V0IDw8ICh0QiA9PSBiLT5CYXNlOjpnZXRUeXBlKCkpIDw8ICIsICI7CgkJYXV0byB0MiA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CgkJYXV0byBkdXJhdGlvbiA9IGR1cmF0aW9uX2Nhc3Q8bWljcm9zZWNvbmRzPiggdDIgLSB0MSApLmNvdW50KCk7CgkJY291dCA8PCAiRHVyYXRpb246ICIgPDwgZHVyYXRpb24gPDwgc3RkOjplbmRsOwoJCQoJfQoJCgl7CgkJYXV0byB0MSA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CgkJZm9yKGF1dG8gaSA9IDA7IGkgPCAxMDAwMDAwMDAwOyArK2kpewoJCQlhdXRvIHJlcyA9IGItPmdldFR5cGUoKTsKCQl9CgkJc3RkOjpjb3V0IDw8ICh0QyA9PSBiLT5nZXRUeXBlKCkpIDw8ICIsICI7CgkJYXV0byB0MiA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CgkJYXV0byBkdXJhdGlvbiA9IGR1cmF0aW9uX2Nhc3Q8bWljcm9zZWNvbmRzPiggdDIgLSB0MSApLmNvdW50KCk7CgkJY291dCA8PCAiRHVyYXRpb246ICIgPDwgZHVyYXRpb24gPDwgc3RkOjplbmRsOwoJCQoJfQoJCglyZXR1cm4gMDsKfQ==