[gnu.g++.bug] class derivation and pointers

saito@sdrvx2.sinet.slb.com (Naoki Saito (GEO-002) Ext. 5471) (10/05/89)

	Hello, folks!  I'm using g++-1.34.2 on Sun3/60 with OS 4.0.1.
Suppose the class Y is derived from the class X.  Then, consider the following
program segment.

X *px;
px = new Y();

In this case, px points to the object X or Y?  And *px is considered as object
X or Y?  I thought that px points to object Y and *px is considered as Y.
However, The following program confused me a lot. Especially, the last 4 lines:

px->mul_print(px1);  => error at compilation time
px->mul_print(*px1); => works! *px1 is considered as X.
px->add_print(px1);  => works! px1 is considered as Y, not the pointer to Y. 
px->add_print(*px1); => error at run time.  core dumps.

This is a bug of the g++-1.34.2?  Or this is normal behavior and my programming
example is not appropriate?  How does the AT&T C++ 2.0 handle these?

Thanks in advance,
Naoki Saito(saito@sdr.slb.com)
Schlumberger-Doll Research

=================================cut===========================================

#include <stream.h>

class X
{
protected:
  float a;
public:
  X();
  X(float);
  virtual void add_print(...){};
  void mul_print(X&);
};

class Y : public X
{
protected:
  float b;
public:
  Y();
  Y(float);
  void add_print(Y&);
};

X::X()
{
  a = 100.0;
}

X::X(float f)
{
  a = f;
}

void X::mul_print(X& x)
{
  cout << "mul_print of class X:" << a * x.a << "\n";
}

Y::Y() : ()
{
  b = 10.0;
}

Y::Y(float f) : (f*2)
{
  b = f;
}

void Y::add_print(Y& y)
{
  cout << "add_print of class Y:" <<  a + b + y.a + y.b << "\n";
}

main()
{
  X *px0, *px1;

  px0 = new Y();
  px1 = new Y(1.0);

//  px0->mul_print(px1); error at compilation time.
  px0->mul_print(*px1);
  px0->add_print(px1);
//  px0->add_print(*px1); error at run time. Bus error (core dumped)
}