Please, answer some questions about "Design by contract" methodology:
1) I can not (from "Liskov Substitution Principle" point of view) create base class Scales and then refine its function in derived classes KitchenScales and IndustrialScales, because subclasses don't behave equally, when using them through pointer to base class. But this two classes KitchenScales and IndustrialScales are very similar, so that's naturally(for me) to create abstract base class for them... How would you express their similarity?

2) If contracts(pre|postconditions) don't specify for base abstract Scales. How do they look to derived class? They are stronger, weaker?

*sorry for my English...

Code:
#include <cassert>

// abstract base class. defines interface for derived classes
class Scales {
public:
  virtual void putOnScales(int weight) = 0; // which post/preconditions?
  // if I don't specify post/preconditions for this base class - are they 
  // the most weaker or the most strongest?
protected:
  Scales() : weight_(0) { }
  int weight_;
};
//------------------------------------------------------------
class KitchenScales : public Scales {
public:
  KitchenScales()  { }
  virtual void putOnScales(int weight) {
    // precoditions
    // this scales only carries weight < 100 pounds
    assert(weight < 100);

    weight_ = weight;

    // postconditions == preconditions
    // ensure, that weight is correct(<100 pounds)
    assert(weight_ < 100);
  }
};
//------------------------------------------------------------
class IndustrialScales : public Scales {
public:
  IndustrialScales()  { }
  virtual void putOnScales(int weight) {
    // precoditions
    // this scales carries weight < 100000 pounds
    assert(weight < 100000);

    weight_ = weight;

    // postconditions == preconditions
    // ensure, that weight is correct(<100000 pounds)
    assert(weight_ < 100000);
  }
};
//------------------------------------------------------------
int main()
{
  KitchenScales ks;
  ks.putOnScales(50);

  IndustrialScales is;
  is.putOnScales(10000);

  Scales *arr[2] = {&ks, &is};
  arr[0]->putOnScales(500); // invokes assert from KitchenScales::putOnScales
  arr[1]->putOnScales(500); // OK

  return 0;
}