c 自定义实现string类 clear_CC++语言15|类的继承和派生实现代码重用、扩充

本文探讨了C++中继承的原理,如何通过public、protected和private访问修饰符实现派生类对基类属性和方法的访问。实例展示了Rectangle类如何从Shape类继承,并解释了构造函数初始化列表的重要性。此外,还介绍了不同类型的继承和派生策略,以及访问控制在继承中的应用。
摘要由CSDN通过智能技术生成

在C++中,继承是一个对象自动获取其父对象的所有属性和行为的过程。通过继承,您可以重用,扩展或修改在其他类中定义的属性和行为。通过继承,可以实现函数重写以及多态。

在C++中,继承另一个类的成员的类称为派生类,其成员被继承的类称为基类。 派生类是基类的子类。

继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。

C++最强大的功能之一就是派生类的使用。通过其类提供类和对象的更一般的属性和行为,通过派生类来逐步特殊化、具体化,体现出一种层次化的关系。既能达到代码重用,还可添加成员或重写成员函数。继承一般有三种形式1) 实现继承:派生类使用基类的属性和方法而无需额外编码;2) 可视继承:子窗体使用父窗体的外观和实现代码;3) 接口继承:仅使用属性和方法,实现滞后到子类实现;

如C++的输入输出流类就能会很地体现这种继承和派生的层次关系:

7eda092f18098ea7eefc4fc73d3414d6.png

定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下:

class derived-class: access-specifier base-class

其中,访问修饰符 access-specifier可以是 public、protected 或 private 其中的一个,base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 private。

实例:

#include using namespace std;// 基类class Shape{public:void setWidth(int w){width = w;}void setHeight(int h){height = h;}protected:int width;int height;};// 派生类class Rectangle: public Shape{public:int getArea(){return (width * height);}};int main(void){Rectangle Rect;Rect.setWidth(5);Rect.setHeight(7);// 输出对象的面积cout << "Total area: " << Rect.getArea() << endl;system("pause");return 0;}//输出:Total area: 35

1 访问控制和继承

派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。

我们可以根据访问权限总结出不同的访问类型,如下所示:

75ddb93edefbfd343b1d8ae981aa30f0.png

2 派生类不能继承的函数成员

一个派生类继承了所有的基类方法,但下列情况除外:

  • 基类的构造函数、析构函数和拷贝构造函数。
  • 基类的重载运算符。
  • 基类的友元函数。

用派生的方法定义一个派生类时,派生类对象中的基类部分必须在构造函数的初始化列表中调用基类的构造函数完成,如:

#include

#include

//代码清单12-11 派生类定义实例car派生taxi

class car {

char no[10];

char owner[10];

char type[20];

public:

car(char *s1, char *s2, char *s3)

{

strcpy(no, s1);

strcpy(owner, s2);

strcpy(type, s3);

}

void modifyNo(char *s) {strcpy(no, s); }

void modifyOwner(char *s) {strcpy(owner, s); }

const char *getNo() const { return no; }

const char *getOwner() const {return owner; }

const char *getType() const { return type; }

};

class taxi : public car {

int seat;

double price;

public:

taxi(char *s1, char *s2, char *s3, int s, double p):car(s1,s2,s3)

{seat = s; price = p; }

double operator() (int start, int end)

{ return price *(end-start); }

int getSeat() const {return seat; }

double getPrice() const { return price; }

};

int main()

{

car car1("沪A01100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值