码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 继承特性

时间:2020-06-21 16:12:04      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:signed   work   string   omd   ssi   c++   nbsp   none   nis   

——派生类需要自己的构造函数。

    派生类中可以根据需要添加额外的数据成员和成员函数,甚至可以给予继承的原成员函数新的定义。

  基类指针或引用可指向派生对象,反过来则只能使用强制类型转换。

  派生类对象可使用基类的非私有成员。

  可使用派生对象初始化基类对象或赋值。

  派生类对象的析构函数被调用后会自动调用基类的析构函数。

 

class RatedPlayer : public TableTennisPlayer
 {
 private:
     unsigned int rating;    // add a data member
 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; }    // add a method
     void ResetRating (unsigned int r) { rating = r; }    // add a method
};

   构造函数必须给新成员和继承的成员提供数据。

RatedPlayer::RatedPlayer(unsigned int r, const string &fn, const string &ln, bool ht) : TableTennisPlayer(fn, ln, ht)
{
    rating = r;
}
  • 派生类构造函数必须使用基类构造函数,创建派生类对象时,程序首先创建基类对象(初始化继承的数据成员)然后再调用派生类构造函数。C++使用成员初始化列表语法完成该操作。
  • 如没有调用基类构造函数,那么将隐式调用基类的默认构造函数。除非要使用默认构造函数,否则应显示调用正确的基类构造函数。

  派生类对象过期时,程序将首先调用派生类析构函数,然后再调用基类析构函数。

  要使用派生类,程序必须要能访问基类声明。

  派生类对象可以使用基类的方法,条件是方法不是私有的(即公有和保护)。

 

  基类指针可以在不进行显示类型转换的情况下指向派生类对象;基类引用可以在不进行显示类型转换的情况下引用派生类对象

RatedPlayer rplayer(1140, "Mallory", "Duck", true);
TableTennisPlayer &rt = rplayer;
TableTennisPlayer *pt =&rplayer;
rt.Name();    // invoke Name() with reference
pt->Name();    // invoke Name() with pointer

  不可以将基类对象和地址赋给派生类引用和指针,除非使用强制转换(欲使用基类的友元函数时,但要小心用错)。

  基类声明的函数引用参数或指针参数可用于值为基类对象或派生类对象以及它们的地址的情况。

void Show(const TableTennisPlayer &rt)
{
    ...
}

 

 

TableTennisPlayer player1("Tara", "Boomdea", false);
RatedPlayer rplayer1(1140, "Mallory", "Duck", true);
Show(player1);    // works with TableTennisPlayer argument
Show(rplayer1);    // works with RatedPlayer argument

  省略形参为const TableTennisPlayer *rt的情况,与上相似。

  引用兼容性属性:可以将基类对象初始化为派生类对象。

RatedPlayer olaf1(1840, "Olaf", "Loaf", true);
TableTennisPlayer olaf2(olaf1);

   匹配的构造函数的原型:

TableTennisPlayer(const RatedPlayer &);    // doesn‘t exit

 

  类中并没有该构造函数,但存在隐式复制构造函数:

// implicit copy constructor
TableTennisPlayer(const TableTennisPlayer &);

   即它将olaf2初始化为嵌套在RatedPlayer对象olaf1中的TableTennisPlayer对象(使用派生类中嵌套的基类对象对目标基类对象进行初始化)

  同样,也可以将派生对象赋给基类对象:

RatedPlayer olaf1(1840, "Olaf", "Loaf", true);
TableTennisPlayer winner;
winner = olaf1;    // assign derived to base object

   在这种情况下,程序使用隐式重载赋值运算符:

TableTennisPlayer &operator=(const TableTennisPlayer &) const;

   与上类似,使用派生类中嵌套的基类对象对目标基类对象进行按成员赋值。

 

  ---

C++ 继承特性

标签:signed   work   string   omd   ssi   c++   nbsp   none   nis   

原文地址:https://www.cnblogs.com/suui90/p/13172391.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!