инициализация объекта\указателя конструктором потомка
есть 2 абстрактных класса:
#ifndef window_cairo__HH
#define window_cairo__HH
struct point {
int x;
int y;
point(int a=0,int b=0) : x(a),y(b) { } ;
};
class window {
public:
virtual point current() =0 ;
virtual void current(const point& p) = 0;
virtual void line(const point& p) =0;
virtual void paint()=0;
virtual ~window() { }
};
#endif
#ifndef cairo_window___HH
#define cairo_window___HH
#include "window.h"
#include <cairo.h>
class cairo_window : public window {
protected: //must be initialized in derived constructor
cairo_t *cr;
point p;
public:
point current();
void current(const point& cp) ;
void line(const point& p1) ;
};
#endif
cairo_window - полюбому не сможет проинициализировать cr, является ли это дефектом планирования иерархии классов?
насколько считаеться приемлимым инициализировать встроенные объекты класса, конструктором потомка?
насколько это приемлимо, если класс является частично абстрактным?
если имеется наследуемый класс:
#ifndef xlib_window__HH
#define xlib_window__HH
#include "cairo_window.h"
#include<cairo-xlib.h>
class xlib_cairo_window : public cairo_window {
Display *dpy;
Window rootwin;
Window win;
int scr;
// cairo_t *cr;
cairo_surface_t *surface;
// point p;
public:
xlib_cairo_window(int x=500,int y=300,const char* pc="hello");
// virtual point current();
// virtual void current(const point& cp);
// virtual void line(const point& p) ;
virtual void paint();
virtual ~xlib_cairo_window();
};
#endif
имеет ли смысл инициализировать p в нем, если cairo_window по большому счету особенно не требуется конструктор?
если сравнивнивать 2 иерархии
class cairo_window : public window
class xlib_cairo_window : public cairo_window
и
сlass window
class xlib_window
class xlib_cairo_window: protected xlib_window, public window
то какие приемущества и недостатки у обоих подходов?