Java互換ライブラリ(2)
JavaのImageクラスは、基本的にインターフェースクラスで、下位のクラスで実装をしています。
インターフェースクラス(virtual)をC++で実装することは出来るのでしょうか?
とりあえず適当に実装してみました。
class Image : public Object{ private: class ImageData : public Object::ObjectData{ friend class Image; }; public: Image(){} Image( const Object& s ) : Object( s ){} Image( Object* p ) : Object( p ){} virtual Graphics getGraphics() = 0; friend class ImageData; }; class ImageEx : public Object{ private: class ImageExData : public Image::ImageData{ friend class ImageEx; }; public: ImageEx(){} ImageEx( const Object& s ) : Object( s ){} ImageEx( Object* p ) : Object( p ){} virtual Graphics getGraphics(); friend class ImageExData; };
なんとかData系のクラスは循環参照が鬱陶しくなったので、全部内部クラスにしてます。そこは関係ないので気にしないで下さい。
で、一目瞭然ですが、このクラス、うまくいきません。
Image img;
Imageクラスには仮想関数が定義されているので、これを書いただけでアウトですね。
Imageクラスの中身を空にして、
virtual Graphics getGraphics(){}
こうやって書いたとしても、メソッドは全てドット演算子によってアクセスしているので、派生先は呼ばれません。
というか、Imageクラスに対するアクセスは全てドット演算子によってアクセスされるのに、virtualにしても意味がないような気がします。