#include <iostream>
enum class Some_Enum_Class
{
A, B, C
};
struct Base {
void * data;
Base(){}
virtual ~Base(){}
// ...
virtual bool Read(){std::cout << "hello from base" << std::endl;}
};
template <Some_Enum_Class T>
struct Derived : Base {
// T-specific interface to deal with Base::data
bool Read() { std::cout << "hello from Derived" << std::endl; }
};
int main() {
Derived <Some_Enum_Class::A> * D = new Derived <Some_Enum_Class::A>;
Base * B = (Base*) D;
void* b = (void*) B;
Base * B2 = (Base*) b;
B2->Read();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKZW51bSBjbGFzcyBTb21lX0VudW1fQ2xhc3MKewoJQSwgQiwgQwp9OwpzdHJ1Y3QgQmFzZSB7CiAgICB2b2lkICogZGF0YTsKICAgIEJhc2UoKXt9CiAgICB2aXJ0dWFsIH5CYXNlKCl7fQogICAgLy8gLi4uCiAgICB2aXJ0dWFsIGJvb2wgUmVhZCgpe3N0ZDo6Y291dCA8PCAiaGVsbG8gZnJvbSBiYXNlIiA8PCBzdGQ6OmVuZGw7fQp9Owp0ZW1wbGF0ZSA8U29tZV9FbnVtX0NsYXNzIFQ+CnN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAvLyBULXNwZWNpZmljIGludGVyZmFjZSB0byBkZWFsIHdpdGggQmFzZTo6ZGF0YQogICAgYm9vbCBSZWFkKCkgeyBzdGQ6OmNvdXQgPDwgImhlbGxvIGZyb20gRGVyaXZlZCIgPDwgc3RkOjplbmRsOyB9Cn07CgoKaW50IG1haW4oKSB7CglEZXJpdmVkIDxTb21lX0VudW1fQ2xhc3M6OkE+ICogRCA9IG5ldyBEZXJpdmVkIDxTb21lX0VudW1fQ2xhc3M6OkE+OwogICAgQmFzZSAqIEIgPSAoQmFzZSopIEQ7CiAgICB2b2lkKiBiID0gKHZvaWQqKSBCOwogICAgQmFzZSAqIEIyID0gKEJhc2UqKSBiOwogICAgQjItPlJlYWQoKTsKCXJldHVybiAwOwp9