#include "mainwindow.h" #include "ui_mainwindow.h" struct C { int x, y; void (*set) (C * t, int a, int b); void (*move) (C * t, int a, int b); // virtual void set (int a, int b) { x=a; y=b; } // virtual void move (int a, int b) { x=x+a; y=y+b; } // C (int aa, int bb) : a (aa) , b (bb) { } }; void C_set_impl (C * t, int a, int b) { t->x=a; t->y=b; } void C_move_impl (C * t, int a, int b) { t->x += a; t->y += b; } C * C_new (C * t = NULL) { C * v = t; if (v == NULL) v = (C*) malloc (sizeof (C)); v->set = C_set_impl; v->move = & C_move_impl; v->x = 0; v->y = 0; return v; } struct D { C old; int r; // virtual void set (int a, int b) { C::set (a,b); r = 1; } // D (int a, int b) : C (a, b) , r (0) { } }; void D_set_impl (D * t, int a, int b) { C_set_impl (&t->old, a, b); t->r=1; } void D_set_jump (C * t, int a, int b) { D_set_impl ((D*) t, a, b); } typedef void (*T) (C*, int, int); D * D_new (D * t = NULL) { D * v = t; if (v == NULL) v = (D*) malloc (sizeof (D)); C_new (&v->old); v->old.set = D_set_jump; v->old.set = ( void (*) (C*, int, int) ) D_set_impl; v->old.set = ( T ) D_set_impl; v->r = 0; return v; } // D * create (int a, int b) { return new D (a, b); } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // C * v = D_new (); // C * v = new D (); D * w = D_new (); C * v = & (w->old); // C * v = & D_new ()->old; // C * v = (C*) D_new (); // C_set_impl (v, 10, 20); // v->C::set (10, 20); v->set (v, 10, 20); // v->set (10, 20); } MainWindow::~MainWindow() { delete ui; }