#include <iostream>
class basic_dgematrix {
public:
int value;
basic_dgematrix( int _value ) {
std::cout << "basic_dgematrix( int );" << std::endl;
value = _value;
}
virtual void initialize( basic_dgematrix & ) const = 0;
};
class dgematrix : public basic_dgematrix {
public:
dgematrix() : basic_dgematrix( 0 ) {
std::cout << "dgematrix();" << std::endl;
}
dgematrix( int _value ) : basic_dgematrix( _value ) {
std::cout << "dgematrix( int );" << std::endl;
}
virtual void initialize( basic_dgematrix & mat ) const {
std::cout << "dgematrix::initialize()" << std::endl;
mat.value = value;
}
};
class _dgematrix : public basic_dgematrix {
public:
_dgematrix( int _value ) : basic_dgematrix( _value ) {
std::cout << "_dgematrix( int );" << std::endl;
};
_dgematrix( const dgematrix & mat ) : basic_dgematrix( mat.value ) {
std::cout << "_dgematrix( dgematrix );" << std::endl;
};
virtual void initialize( basic_dgematrix & mat ) const {
std::cout << "_dgematrix::initialize()" << std::endl;
mat.value = value;
}
};
class basic_dssmatrix {
public:
int value;
basic_dssmatrix( int _value ) {
std::cout << "basic_dssmatrix( int );" << std::endl;
value = _value;
}
};
class dssmatrix : public basic_dssmatrix {
public:
dssmatrix( int _value ) : basic_dssmatrix( _value ) {
std::cout << "dssmatrix( int );" << std::endl;
}
};
class _dssmatrix : public basic_dssmatrix {
public:
_dssmatrix( int _value ) : basic_dssmatrix( _value ) {
std::cout << "_dssmatrix( int );" << std::endl;
}
_dssmatrix( const dssmatrix & mat ) : basic_dssmatrix( mat.value ) {
std::cout << "_dssmatrix( dssmatrix );" << std::endl;
}
};
_dgematrix operator + ( const basic_dssmatrix & matA, const basic_dgematrix & matB ) {
dgematrix newmat;
matB.initialize( newmat );
newmat.value += matA.value;
return newmat;
}
int main(int argc, char *argv[]) {
dssmatrix s( 2 );
dgematrix g( 3 );
_dgematrix _g( 5 );
std::cout << "s + g;" << std::endl;
s + g;
std::cout << std::endl;
std::cout << "s + _g;" << std::endl;
s + _g;
return 0;
}