时间:2021-05-19
——派生类需要自己的构造函数。
派生类中可以根据需要添加额外的数据成员和成员函数,甚至可以给予继承的原成员函数新的定义。
基类指针或引用可指向派生对象,反过来则只能使用强制类型转换。
派生类对象可使用基类的非私有成员。
可使用派生对象初始化基类对象或赋值。
一般不允许将基类对象赋给派生类对象(上面第三条),特殊情况下可以。
已有派生类对象初始化创建的派生类对象。
已有派生类对象给另一个派生类对象赋值。
派生类对象的析构函数被调用后会自动调用基类的析构函数。
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;}派生类对象过期时,程序将首先调用派生类析构函数,然后再自动调用基类析构函数。
要使用派生类,程序必须要能访问基类声明。
派生类对象可以使用基类的方法,条件是方法不是私有的(即公有和保护)。
基类指针可以在不进行显示类型转换的情况下指向派生类对象;基类引用可以在不进行显示类型转换的情况下引用派生类对象
RatedPlayer rplayer(1140, "Mallory", "Duck", true);TableTennisPlayer &rt = rplayer;TableTennisPlayer *pt =&rplayer;rt.Name(); // invoke Name() with referencept->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 argumentShow(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 constructorTableTennisPlayer(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++ 继承特性的详细内容,更多关于c++ 继承特性的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、前言在上一篇C++基础博文中讨论了C++最基本的代码重用特性——类继承,派生类可以在继承基类元素的同时,添加新的成员和方法。但是没有考虑一种情况:派生类继承
C++类中的继承实例详解实例效果:实现代码:#include#includeusingnamespacestd;classPerson{public:Perso
本文实例讲解了C++中基类和派生类之间的转换。对于深入理解C++面向对象程序设计有一定的帮助作用。此处需要注意:本文实例讲解内容的前提是派生类继承基类的方式是公
1.C#是一种从C++和Java继承而来的,简单的,现代的,面向对象的语言.2.它的目标是综合VisualBasic高产和C++底层高效的特性.3.它是Micr
本文实例讲述了C++多重继承引发的重复调用问题与解决方法。分享给大家供大家参考,具体如下:前面简单介绍了一个C++多重继承功能示例,这里再来分析一个多重继承引发