实例代码讲解c++ 继承特性

 更新时间:2020年07月02日 15:38:06   作者:绿豆sir  
这篇文章主要介绍了c++ 继承特性的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

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

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

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

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

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

   一般不允许将基类对象赋给派生类对象(上面第三条),特殊情况下可以。

   已有派生类对象初始化创建的派生类对象。

   已有派生类对象给另一个派生类对象赋值。

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

   C++11增加了允许继承构造函数的机制,但派生类默认不能继承构造函数和析构函数。

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;

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

       特殊的用基类对象给派生类对象赋值的情况

       如果派生类包含了将基类对象转换为派生类对象的构造函数,或派生类定义了将基类对象赋给派生类对象的赋值运算符,则可以用派生类对象给基类对象赋值。

       用已有的派生类对象初始化创建的派生类对象

       复制类成员或继承的类组件时,则是使用该类的复制构造函数完成的,对于继承的基类对象来说也是合适的。

       用已有的派生类对象给另一个派生类对象赋值

       按成员赋值,调用类成员赋值运算符,使用基类的赋值运算符来对基类组件(继承的基类对象)进行赋值

       若派生类使用了动态内存分配,派生类的析构函数、复制构造函数、复制运算符都必须使用相应的基类方法来处理基类元素(显示调用基类构造函数和复制运算符):

  • 对于析构函数,这是自动完成的。
  • 对于复制构造函数,这是在初始化成员列表中调用基类的复制构造函数来完成的;如果不这么做,将自动调用基类的默认构造函数。
  • 对于复制运算符,这是通过使用作用域解析运算符显示地调用基类的赋值运算符来完成的:
hasDMA &hasDMA::operator=(const hasDMA &has)
{
 if (this == &hs)
 return *this;
 baseDMA::operator=(hs); // copy base portion
 ...
 return *this; 
}

以上就是实例代码讲解c++ 继承特性的详细内容,更多关于c++ 继承特性的资料请关注脚本之家其它相关文章!

相关文章

  • Qt实现绘制一个简单多边形的示例代码

    Qt实现绘制一个简单多边形的示例代码

    QT提供了图形绘制接口QPainter,通过该接口可以绘制多种图形,包括多边形。本文就来利用它实现绘制一个简单的多边形,感兴趣的可以尝试一下
    2022-11-11
  • C语言数据结构顺序表的进阶讲解

    C语言数据结构顺序表的进阶讲解

    程序中经常需要将一组数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化,顺序表则是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示
    2022-04-04
  • 关于c++ 智能指针及 循环引用的问题

    关于c++ 智能指针及 循环引用的问题

    下面小编就为大家带来一篇关于c++ 智能指针及 循环引用的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 数据结构串的操作实例详解

    数据结构串的操作实例详解

    这篇文章主要介绍了数据结构串的操作实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • C/C++关于实现CAN信号的获取方法

    C/C++关于实现CAN信号的获取方法

    这篇文章主要介绍了C/C++关于实现CAN信号的获取方法,标准的CAN 数据为8字节,即64位,但是CAN FD的最大数据可为64字节,为512位,其中的帧ID分为标准帧和扩展帧,其中用11位标准帧,用29位表示扩展帧
    2023-02-02
  • 实现去除c语言注释的小工具

    实现去除c语言注释的小工具

    这篇文章主要介绍了实现去除c语言注释的小工具,说是C语言,但其实所有C语系的都可以,比如Java,需要的朋友可以参考下
    2014-02-02
  • C语言数据结构之单链表操作详解

    C语言数据结构之单链表操作详解

    链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。本文将和大家一起聊聊C语言中单链表的常用操作,感兴趣的可以学习一下
    2022-07-07
  • C和C++11之enum枚举的具体使用方法

    C和C++11之enum枚举的具体使用方法

    这篇文章主要介绍了C和C++11之enum枚举的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C++ float、double判断是否等于0问题

    C++ float、double判断是否等于0问题

    这篇文章主要介绍了C++ float、double判断是否等于0问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • C语言使用DP动态规划思想解最大K乘积与乘积最大问题

    C语言使用DP动态规划思想解最大K乘积与乘积最大问题

    Dynamic Programming动态规划方法采用最优原则来建立用于计算最优解的递归式,并且考察每个最优决策序列中是否包含一个最优子序列,这里我们就来展示C语言使用DP动态规划思想解最大K乘积与乘积最大问题
    2016-06-06

最新评论