September 23, 2002
Sample code:

/* subcast.cpp */
#include <memory.h>
#include <iostream.h>

class Matrix {
protected:
   int v[3][3];
public:
   Matrix() { cerr << "Matrix::ctor()" << endl; };
   Matrix(const Matrix &m) {
      cerr << "Matrix::ctor(const Matrix &)" << endl;
      memcpy(v, m.v, sizeof(v));
   };
};

class SquareMatrix: public Matrix {
private:
   int det;
public:
   SquareMatrix(): Matrix() {
      cerr << "SquareMatrix::ctor()" << endl;
      det = 0;
   };
   SquareMatrix(const SquareMatrix &m): Matrix(m) {
      cerr << "SquareMatrix::ctor(const SquareMatrix &)" << endl;
      det = m.det;
   };
};

int main()
{
   Matrix m1;
   SquareMatrix m2((SquareMatrix)m1);

   return 0;
}


This compiles ok and runs ok giving on stderr:

Matrix::ctor()
Matrix::ctor(const Matrix &)
SquareMatrix::ctor(const SquareMatrix &)

This mean that only two objects constructed: m1 of type Matrix (first
output line) and m2 of type SquareMatrix (second and third output
lines).  So the question:  How the compiler converts object of class
Matrix to objects of its subclass SquareMatrix without creating any
objects?

This sample code gives compile-time error about unability to convert
from Matrix to SquareMatrix while compiled by g++ and KAI C++.

September 23, 2002
That's a bug. I'll fix it in the next patch.