struct data
{
char c[100];
};
class view
{
public:
view(data d) :
first(&d.c[0]),
last(&d.c[100])
{
}
private:
char * first;
char * last;
};
class data_interface
{
virtual view get_view() = 0;
};
class base_owns_data : public data_interface
{
public:
view get_view() override
{
return view(d);
}
private:
data d;
};
view some_process(base_owns_data *b)
{
auto working_view = b->base_owns_data::get_view();
// Do a bunch of things to filter the view
return working_view;
}
class derived_owns_data : public base_owns_data
{
public:
base_owns_data * as_base()
{
return this;
}
view get_view() override
{
return some_process(this->as_base());
}
};
int main() {
derived_owns_data d;
d.get_view();
return 0;
}
c3RydWN0IGRhdGEKewoJY2hhciBjWzEwMF07Cn07CgpjbGFzcyB2aWV3CnsKcHVibGljOgoJdmlldyhkYXRhIGQpIDoKCQlmaXJzdCgmZC5jWzBdKSwKCQlsYXN0KCZkLmNbMTAwXSkKCXsKCQkKCX0KcHJpdmF0ZToKCWNoYXIgKiBmaXJzdDsKCWNoYXIgKiBsYXN0Owp9OwoKY2xhc3MgZGF0YV9pbnRlcmZhY2UKewoJdmlydHVhbCB2aWV3IGdldF92aWV3KCkgPSAwOwp9OwoKY2xhc3MgYmFzZV9vd25zX2RhdGEgOiBwdWJsaWMgZGF0YV9pbnRlcmZhY2UKewpwdWJsaWM6Cgl2aWV3IGdldF92aWV3KCkgb3ZlcnJpZGUKCXsKCQlyZXR1cm4gdmlldyhkKTsKCX0KCQpwcml2YXRlOgoJZGF0YSBkOwp9OwoKdmlldyBzb21lX3Byb2Nlc3MoYmFzZV9vd25zX2RhdGEgKmIpCnsKCWF1dG8gd29ya2luZ192aWV3ID0gYi0+YmFzZV9vd25zX2RhdGE6OmdldF92aWV3KCk7CgkvLyBEbyBhIGJ1bmNoIG9mIHRoaW5ncyB0byBmaWx0ZXIgdGhlIHZpZXcKCXJldHVybiB3b3JraW5nX3ZpZXc7Cn0KCmNsYXNzIGRlcml2ZWRfb3duc19kYXRhIDogcHVibGljIGJhc2Vfb3duc19kYXRhCnsKcHVibGljOgoJYmFzZV9vd25zX2RhdGEgKiBhc19iYXNlKCkKCXsKCQlyZXR1cm4gdGhpczsKCX0KCgl2aWV3IGdldF92aWV3KCkgb3ZlcnJpZGUKCXsKCQlyZXR1cm4gc29tZV9wcm9jZXNzKHRoaXMtPmFzX2Jhc2UoKSk7CQoJfQp9OwoKCmludCBtYWluKCkgewoJZGVyaXZlZF9vd25zX2RhdGEgZDsKCWQuZ2V0X3ZpZXcoKTsKCXJldHVybiAwOwp9