[Solved] C++: new base class,but it can access the derived class’s property


Some side comments on your code.

In this example, you probably want virtual functions. See this modification of your code with some comments :

#include <iostream>

class Animal
{
  public:
    virtual ~Animal() {} // Always define virtual destructor in this case
    virtual void breathe() const  // This fonction doesn't modify the object
    {                             // then, add 'const' at the end
      std::cout << "breathe!" << std::endl;
    }
    unsigned int height; // An animal can't have a negative height ;-)
                         // then, use an unsigned type.
};

class Fish : public Animal
{
  public:
    virtual ~Fish() {}
    virtual void breathe() const
    {
      std::cout << "fish breathe!" << std::endl;
    }
    unsigned int weight;
};

int main()
{
  Animal* p_animal = new Animal;  // Don't put () for empty constructor
  Animal* p_fish = new Fish;

  p_animal->breathe(); // this prints "breathe!"
  p_fish->breathe();  // this prints "fish breathe!" even if the pointer is
                      // an pointer to Animal. It's the behaviour of virtual
                      // functions : when the code is executed, the real type
                      // is checked and the corresponding function is called.

  p_fish->height = 10;  // This works
  // p_fish->weight = 5;  // This doesn't compile, it's an pointer to Animal

  Fish* p_real_fish = dynamic_cast<Fish*>(p_fish);
  p_real_fish->height = 10;  // This works
  p_real_fish->weight = 5;  // This works too

  delete p_animal;  // Don't forget to release the memory !
  delete p_fish;
}

I hope this can help you.

solved C++: new base class,but it can access the derived class’s property