C++类继承

2.其他类的方法
(1)构造函数
创建新对象,因此不能被继承。

(2)析构函数
一定要定义显式析构函数来释放类构造函数使用new分配的所有内存,并完成类对象所需的任何特殊的清理工作。
对于基类,即使它不需要析构函数,也应提供。

(3)转换
要将类转换为其他类型,应定义转换函数。
转换函数可以是没有参数的类成员函数,也可以是返回类型被声明为目标类型的类成员函数。

(4)按值传递对象与传递引用
通常,编写使用对象作为参数的函数时,应按引用而不是按值来传递函数。
原因:
一是提高效率。
二是,在继承使用虚函数时,被定义为接受基类引用参数的函数可以接受派生类。

(5)返回对象和返回引用
首先,在编码方面,直接返回对象与返回引用之间唯一的区别在于函数原型和函数头:

Star noval(const Star &);
Star & noval(const Star &);
1
2
其次,应返回引用而不返回对象的原因在于,返回对象涉及生成返回对象的临时副本,这是调用函数的程序可以使用的副本。

返回对象的时间成本包括带哦用复制构造函数来生成副本所需的时间和调用析构函数删除副本所需的时间。返回引用可以节省时间和内存。
直接返回对象与按值传递对象相似:都生成临时副本;返回引用于按引用传递对象相似:调用和被调用的函数对同一个对象进行操作。
但,并不总是可以使用返回引用,函数不能返回在函数中创建的临时对象的引用(函数结束时,临时对象被销毁)。

通用规则:

如果函数返回的是通过引用或指针传递给它的对象,则按引用返回对象;
如果函数返回在函数中创建的临时对象,则不能使用引用。
(6)使用const

使用const保护方法不修改参数;
Star::Star(const char * s) { … }

使用const确保方法不修改调用它的对象;
void Star::show( ) const { … }//这里const表示const Star *this,而this指向调用的对象

可以将返回引用的函数放在赋值语句的左侧,这实际上意味着可以将值赋给引用的对象。但可以使用const来确保引用或指针返回的值不能用于修改对象中的数据:

const Stock &Stock::topval(const Stock & s) const
{
if (s.total_val > total_val)
return s;
else
return *this;
}

该方法返回对this或s的引用,因为this和s都被声明为const,所以函数不能对它们进行修改,这意味着返回的引用也必须声明为const。

3.公有继承中的考虑因素
(1)is-a关系
遵循is-a关系,如果派生类不是一种特殊的基类,则不要使用公有派生。
某些情况下,最好的方法可能是创建包含纯虚函数的抽象数据类,并从它派生出其他的类。

(2)什么不能被继承

构造函数不能被继承。但,派生类构造函数通常使用成员初始化列表语法来调用基类构造函数,以创建派生对象的基类部分。若没有显示调用,则使用基类的默认构造函数。
析构函数不能继承。但,释放对象时,程序首先调用派生类的析构函数,再调用基类的构造函数。通常,对于基类,其析构函数应设置为虚的。
赋值运算符不能继承。
(3)赋值运算符

如果编译器发现程序将一个对象赋给另一个对象,它将自动为这个类提供一个赋值运算符。默认采用成员赋值。
如果类构造函数使用new来初始化指针,则需要提供一个显式赋值运算符。
如果派生类使用了new,则必须也为其提供显式赋值运算符。
是否可以将基类对象赋给派生对象?
也许。如果派生类中包含了这样的构造函数,即对将基类对象转换为派生类对象进行了定义,则可以将基类对象赋给派生对象。如果派生类定义了用于将基类对象赋给派生对象的赋值操作符,也可以这样做。若这两个条件都不满足,则除非使用显式强制类型,不能这样做。

(4)私有成员和保护成员
对派生类而言,保护成员类似公有成员;对于外部而言,保护成员类似私有成员。
派生类可以直接访问基类的保护成员,但只能通过基类的成员函数来访问私有成员。

(5)虚方法
若希望派生类能够重新定义方法,则应在基类中将方法定义为虚的。

(6)析构函数
基类的析构函数应该是虚的。

(7)友元函数
友元函数并非类成员,故不能被继承。
若希望派生类的友元函数能够使用基类的友元函数,可以通过强制类型转换。

(8)有关使用基类方法的说明

以公有方式派生的类的对象可以通过多种方式使用基类方法:
派生类自动使用继承而来的基类方法,如果派生类没有重新定义改方法;
派生类的构造函数自动调用基类的构造函数;
派生类的构造函数自动调用基类的默认构造函数,如果没有在成员初始化列表中指定构造函数;
派生类构造函数显式的调用成员初始化列表中指定的基类构造函数;
派生类方法可以使用作用域解析符来调用公有的和受保护的基类方法;
派生类的友元函数可以通过强制类型转换,将派生类引用或指针转为为基类引用或指针,然后使用该引用或指针调用基类的友元函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值