继承与派生,多态

class TableTennisPlayer{
  private:
  string firstname;
  string lastname;
  bool hasTable;
publc:
  TableTennisPlayer(const string & fn="none",const string & ln="none",bool ht =false);
  void name() const;
  bool hasTable(return hasTable);
  void ResetTable(bool v){hasTable=v};
}

class RatedPlayer:public TableTennisPlayer{
  private: unsigned int rating;
 public:
RatedPlayer(unsigned int r=0,const string &fn="none",const string & ln="none",bool ht=false);
RatedPlayer(unsigned int r,const TableTennisPlayer &tp);
unsigned int Rating()const{return rating;}
void ResetRating(unsigned int r){rating =r;}
}
}
1.使用派生类调用基类的拷贝构造函数
RatedPlayer olaf1(1840,"Olaf","Loaf",true);
TableTennisPlayer olaf2(olaf1);
表面上调用:
TableTennisPlayer(const RatedPlayer &);
实际调用,基类的拷贝构造函数:
TableTennisPlayer(const TableTennisPlayer &);
2.隐式调用基类的=重载
RatedPlayer olaf1(1840,"Olaf","Loaf",true);
TableTennisPlayer winner;
winner=olaf1;
隐式调用
TableTennisPlayer & operator=(const TableTennisPlayer &)const;
3.上述调用只完成基类数据成员的拷贝和赋值,派生类的数据成员并没有被赋值。
4.Is a和Has a
午饭有一个香蕉 午饭中包含香蕉这个对象
香蕉是一种水果 香蕉是水果的派生类
class Brass{
  public:
  virtual void ViewAcct()const;
}
class BrassPlus:public Brass{
  public:
  virtual void ViewAcct()const;
}
使用vitural 关键字定义虚函数,实现多态
Brass dom();
BrassPlus dot();
Brass &b1_ref=dom;
Brass &b2_ref=dot;
b1_ref.ViewAcct();//Brass ViewAcct();
b2_ref.ViewAcct();//BrassPlus ViewAcct();
//在基类中用了vitural关键字的函数在派生类也是virtual,比较好的做法是都用virtual声明,不易出错
注意作用域符号的使用
void BrassPlus::ViewAcct()const{
  ViewAcct();//错误,递归调用了Brass::ViewAcct();
  Brass::ViewAcct();//正确
//使用指向基类的指针实现多态
//使用虚析构函数实现多态的对象析构处理
}
posted @ 2024-08-09 15:13  zhongta  阅读(22)  评论(0)    收藏  举报