类继承,公有继承,多态公有继承

从一个类派生出另一个类时,原始类成为基类,继承类成为派生类。

其语法为:

class Subclass:public Parent_class{  //注意基类前的public修饰
       ......
};


派生类不能直接访问基类的私有成员,必须通过公有方法(或者说基类方法)来访问,所以在写类的时候,最好写好访问私有对象的公有方法。具体地说,派生类的构造函数必须使用基类的构造函数。

创建派生类对象时,程序首先创建基类对象,这意味着基类对象应当在程序进入派生类的构造函数之前被建立。

派生类无法继承基类的构造函数和赋值操作符重载。

派生类的构造函数语法为:

class Subclass:Parent_class{
public:
       Subclass(typename arg1,typename arg2,typename arg3):Parent_class(arg1,arg3){
       ......
       }
};


派生类和基类之间有一些特殊的关系

第一个就是上面提到的派生类可以调用基类的公有方法。

第二个是基类对象的指针可以在不进行显示类型转换的情况下直接指向派生类对象,但基类指针只能调用基类的方法,不能使用派生类的方法。相似的,基类对象的引用也能在不进行显示类型转换的情况下引用派生类对象,但基类引用只能调用基类方法,不能调用派生类方法。通常C++要求引用和指针类型与赋给的类型匹配,但这一规则对类继承来说是个例外,不过,这种例外是单向的,派生类的指针和引用不能指向基类。

对于这一点的实际应用,举一个例子,比如fruit类派生出的apple,banana,orange类,如果想用一个数组来储存这些不同的类的对象,可以创建一个指向fruit类对象的指针数组来储存。


上面提到的其实只是类继承的一种方式,成为公有继承,它建立的是一种is-a关系,即派生类对象也是基类对象,可以对基类对象和派生类对象执行任何操作。比如说fruit类派生出一个apple类,apple这个派生类本身也是基类fruit的一员。

在实际生活中,我们对类的需求可能更复杂一点,比如想要一个方法在派生类和基类中的行为不同,这种特性称为多态,即字面意义上的一个方法具有多种形态。


有两种重要的机制可用于实现多态公有继承,其一为在派生类中重新定义基类方法,其二为使用虚方法。实例如下:

class Parent_class{
public:
       virtual returntype method(arg1){}
};

class Subclass:public Parent_class{
public:
       virtual returntype method(arg2){}
};


分别用virtual关键字修饰基类和派生类的method来构造虚方法,可以分别在基类和派生类中实现不同的功能。若想调用基类的method,则是parent.method()(Parent_class parent),若想调用派生类的method,则是subclass.method(Subclass subclass)。


在此说明一下这个virtual关键字,实际上只要在基类中用virtual修饰method,那在派生类中method会默认成为虚函数,只是在派生类中再标注一下可以更清楚地显示哪些方法是虚方法。


关于virtual关键字,会涉及一个编译器的编译问题。一般情况下一个函数名只和一段可执行代码块联编,这可以在程序执行前预先联结好,称为静态联编。但virtual关键字必须使用动态联编。

而且virtual关键字不能用于友元,因为友元本质上不是类成员函数,是外部函数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值