C (练习)第8章,继承与派生
1:protected或保护
9.在声明派生类时,如果不显式地给出继承方式,缺省的类继承方式是私有继承private。已知有如下类定义:
class Base
{
protected:
void fun( ) {}
};
class Derived : Base
{ };
则Base类中的成员函数fun( ),在Derived类中的访问权限是__1__(注意:要求填写private、protected或public中的一项)。
2.继承的方式有公有继承、私有继承和__1__3种。
参考答案
1:保护继承
3.派生类的成员一般分为两部分,一部分是从基类__1__的成员,另一部分是自己定义的新成员。
参考答案
1:派生或继承
4.由保护派生得到的派生类,它从基类继承的公有和保护成员都将变为派生类的__1__。
参考答案
1:保护成员
5.生成一个派生类对象时,先调用__1__的构造函数,然后调用派生类的构造函数。
参考答案
1:private
10.在多继承中基类和派生类中同时出现__1__存在二义性。
参考答案
1:同名函数
11.派生类是基类的组合,多继承可以看作是多个__1__的简单组合。
参考答案
1:单继承
12.虚函数不得声明为__1__函数。
参考答案
1:静态
13.构造函数不能被继承,析构函数__1__被继承。
参考答案
参考答案
1:基类
6.在公有继承关系下,派生类的对象可以访问基类中的__1__成员。
参考答案
1:公有
7.对于派生类的构造函数,在定义对象时构造函数的执行顺序为:先执行调用__1__的构造函数,再执行调用对象成员的构造函数,最后执行派生类的构造函数体中的内容。
参考答案
1:基类
8.如果希望从基类继承的公有成员,只能被派生类及派生类的子类中的所有非静态成员函数和友元函数直接访问,其它的外部函数不能访问,则应使用__1__继承。
C当通过private继承时,基类中的protected成员数据不能被派生类的成员函数访问。
D当通过public继承时,基类中的protected成员数据可以被派生类的成员函数访问。
参考答案
C
11.继承与派生可以给软件开发带来很多好处,下述中不正确的是:
A避免公用代码的重复开发,提高了程序开发的效率和质量。
C派生类可以重载基类中的成员函数
D派生类可以有选择性地继承基类中的某些成员,删除不需要的成员
参考答案
D
9.下面关于基类与派生类的访问控制规则的叙述,错误的是
A不管是何种派生,基类的private成员都不能被其派生类访问。
B在派生类中访问基类的private成员可以通过基类的public和protected成员函数访问。
B可以减少代码和数据的冗余。
C通过层次关系组织对象,给编码与代码重用带来了方便。
D软件的执行效率大大提高
参考答案
D
12.下面关于继承的描述中,错误的是________。
A继承描述的是类的层次关系,派生类可以具有与基类相同的属性和方法
B一个基类可以有多个派生类,一个派生类可以有多个基类
C C++有两种继承包括单一继承和多重继承
D静态成员不可以被继承
参考答案
D
13.下列描述中哪个是正确的__________。
A私有派生的子类无法访问父类的成员
B类A的私有派生子类的派生类C无法初始化其祖先类A对象的属性,因为类A的成员对类C是不可访问的
C私有派生类不能作为基类派生子类
D私有派生类的所有子孙类将无法继续继承该类的成员
参考答案
B
class Base
{
protected:
void fun( ) {}
};
class Derived : Base
{ };
则Base类中的成员函数fun( ),在Derived类中的访问权限是__1__(注意:要求填写private、protected或public中的一项)。
参考答案
1:private
1:不能
三.问答题
四.编程题
{};
class D : public B, public C
{ };
现定义D类对象d,则以下正确的是( )。
A d.x=5;
B出现二义性
C会调用5次构造函数
D都不对
参考答案
A
8.下面有关基类和派生类的说法中,错误的是( )。
A派生类可以增添一些基类中没有的成员
B派生类中可出现与基类同名的成员(若是成员函数则参数的个数和类型相同),但会出现同名覆盖现象;若要引用或调用基类中同名的成员,必须用访问域控制符(基类::成员)加以指明
};
class A2: public A1
{
public:
void show2( ) { cout<<"class A2"<<endl; }
};
class A3: protected A2
{
public:
void show3( ) { cout<<"class A3"<<endl; }
};
void main()
14.下列描述中错误的是( )。
A继承分为多重继承和单继承
B对象间通信靠传递消息实现
C在外面看不到对象的内部特征是基于对象的"模块独立性好"这个特征
D类是具有共同属性、共同方法的对象的集合
参考答案
C
15.设有以下定义:
#include<iostream.h>
class A1
{
public:
void show1() { cout<<"class A1"<<endl; }
{
A1 obj1;
A2 obj2;
A3 obj3;
...
}
以下不合法的调用语句是( )。
A obj1.show1();
B obj2.show1();
C obj3.show1();
D obj2.show2();
参考答案
C
16.
二.填空题
1.在声明派生类时,如果不显式地给出继承方式,缺省的类继承方式是私有继承private。已知有如下类定义:
D具有继承.设置虚基类的目的是( )。
A简化程序
B消除二义性
C提高运行效率
D减少目标代码
参考答案
B
6.有以下定义的子类:
class A:public B
{ ... };
则下面描述中正确的是
A A类中的成员函数可以访问B类中的private数据成员
B A类中的成员函数只能访问B类中的protected数据成员。
C A类中的成员函数可以访问B类中的public数据成员。
D A类中的成员函数只能访问B类中的public数据成员
参考答案
C
7.有如下类定义:
class A
{
public:
int x;
};
class B : virtual public A
{ };
class C : virtual public A
一,单选题
1.下列描述中错误的是( )。
A继承分为多重继承和单继承
B对象间通信靠传递消息实现
C在外面看不到对象的内部特征是基于对象的"模块独立性好"这个特征
D类是具有共同属性、共同方法的对象的集合
参考答案
C
2.设有以下定义:
#include<iostream.h>
class A1
{
public:
void show1() { cout<<"class A1"<<endl; }
{
A1 obj1;
A2 obj2;
A3 obj3;
...
}
以下不合法的调用语句是( )。
A obj1.show1();
B obj2.show1();
C obj3.show1();
D obj2.show2();
参考答案
C
3.下列描述中哪个是正确的__________。??????
A私有派生的子类无法访问父类的成员
};
class A2: public A1
{
public:
void show2( ) { cout<<"class A2"<<endl; }
};
class A3: protected A2
{
public:
void show3( ) { cout<<"class A3"<<endl; }
};
void main()
B类A的私有派生子类的派生类C无法初始化其祖先类A对象的属性,因为类A的成员对类C是不可访问的
C私有派生类不能作为基类派生子类
D私有派生类的所有子孙类将无法继续继承该类的成员
参考答案
B
4.下面有关派生类的说法中,错误的是( )。
A一个派生类可以作为另一个派生类的基类
B一个派生类可以有多个基类
C派生类构造函数可以将初始化参数值传递给基类的构造函数和对象成员的构造函数
C++第08章+继承与派生
10
第八章 继承与派生
基类成员在派生类中的存取权限
(1) 无论何种派生方式,基类的私有成员在派生类中不 能访问;基类的保护成员和公有成员在派生类内部可进 行存取。 (2) 私有派生使基类的保护成员和公有成员都成为派生 类的私有成员,在派生类中可直接访问,在类外不能访 问。一般情况下,私有派生使用较少,它中止了基类功 能的进一步派生。 (3) 保护派生使基类的保护成员和公有成员都成为派生 类的保护成员,在派生类中可直接访问,在类外不能访 问。它与私有派生的不同表现在进一步派生时。 (4) 公有派生使基类的保护成员和公有成员在派生类中 不变,仍然是保护成员和公有成员。在类外可访问公有 11 成员,不可访问保护成员。
26
第八章 继承与派生
3. 赋值兼容规则 派生类对象间的赋值操作依据下面的原则: (1) 如果派生类有自己的赋值运算符的重载定义, 即按该重载函数处理。 (2) 派生类未定义自己的赋值操作,而基类定义了 赋值操作,则系统自动定义派生类赋值操作,其中 基类成员的赋值按基类的赋值操作进行。 (3) 二者都未定义专门的赋值操作,系统自动定义 缺省赋值操作。
生类继承的成员仍是某类的友元。
25
第八章 继承与派生
2. 静态成员的继承 如果基类的静态成员是公有的或是保护的,则 它们被其派生类继承为派生类的静态成员。即: (1) 这些成员通常用<类名>::<成员名>方式引 用或调用(在派生类的访问属性为public时)。 (2) 这些成员无论有多少个对象被创建,都只有一 个拷贝。它为基类和派生类的所有对象共享。
13
第八章 继承与派生
例:
雇员
兼职技术人员
管理人员
销售人员
销售经理
C继承和派生
C继承和派生简单来说:有两个类A和B,A是父类,B是子类。
那么就可以说:A派生出B,B继承与A。
例:父亲“派生” 出儿子儿子“继承” 自父亲派生和继承,本质是相同的,只是从不同角度来描述他们而已。
继承和派生在UML中的表示:注意是空心三角形从子类【派生的类】指向父类【被继承的类】父类,也被称为”基类”除了”构造函数“ 和”析构函数“,父类的所有成员函数,以及数据成员,都会被子类继承!假如已经定义好了父类Father,里面定义好私有数据成员name 和age,和公有的构造函数、成员方法description等。
当子类Son 要继承父类Father时,需要包含”父类的头文件“,定义方式如下:公有继承方式#include "Father.h" // 包含父类的头文件class Son : public Father {// 详细见下面全部代码}假如子类Son要调用自定义的重载构造函数是:1.会先调用父类的构造函数,用来初始化父类继承的数据,2.再掉用自己的构造函数,用来初始化自己定义的数据。
例:Son::Son(const char *name, int age, const char *game) : Father(name, age) {// 没有体现父类的构造函数, 那就会自动调用父类的默认构造函数this->game = game; // 子类自己定义的数据成员}注意一:子类的成员函数,不能访问从父类继承的private成员例:在子类Son中,this->name = name;或者cout << age << endl;都是错误的。
但子类可以访问父类的成员函数,如cout << getName() << getAge() << endl;都是正确的。
注意二:子类对象调用方法时,现在自己定义的方法中去寻找,如果有,就调用自己定义的方法;如果找不到,就到父类的方法中去找,如果有,就调用父类的这个同名方法;如果在父类中找不到,就发生错误!例:父类和子类都定义了description方法,子类Son去调用这个方法,会优先在自己的方法里去找来调用,如果没有,再去父类里找;也没有的话就报错。
《继承与派生 》课件
目录
CONTENTS
• 继承与派生的基本概念 • 继承的方式 • 派生类的构造函数和析构函数 • 继承与多态 • 继承与重载
01
继承与派生的基本 概念
继承的定义
继承是面向对象编程中的一个重 要概念,它允许一个类(子类) 继承另一个类(父类)的属性和
方法。
通过继承,子类可以复用父类的 代码,减少代码冗余,提高代码
保护继承
总结词
保护继承是指基类的保护成员在派生类 中保持保护属性,可以被派生类和派生 类的对象访问。
VS
详细描述
保护继承时,基类的保护成员在派生类中 保持保护属性,可以被派生类和派生类的 对象访问。这种继承方式使得基类的保护 成员成为派生类的保护成员,可以被派生 类和派生类的对象访问。因此,派生类可 以继承基类的保护成员函数和变量。
03
派生类的构造函数 和析构函数
派生类的构造函数
派生类构造函数的作用
派生类构造函数用于初始化派生类对象,包括调用基类构造函数 和执行派生类特有的初始化操作。
派生类构造函数的执行顺序
派生类构造函数的执行顺序是在创建派生类对象时,先调用基类构 造函数,然后执行派生类构造函数体中的代码。
派生类构造函数的参数
继承和派生共同实现 了面向对象编程中的 代码复用和多态性。
派生是继承的一种表 现形式,通过派生可 以创建新的类。
02
继承的方式
公有继承
总结词
公有继承是ቤተ መጻሕፍቲ ባይዱ基类的公有成员在派生类中仍为公有成员,可以被派生类和派生类的对象访问。
详细描述
公有继承时,基类的公有成员在派生类中保持公有属性,派生类可以访问基类的公有和保护成员。这种继承方式 使得基类的公有成员成为派生类的公有成员,可以被派生类和派生类的对象直接访问,因此派生类可以继承基类 的公有成员函数和变量。
C++继承与派生
8
8.2.3 派生类对象的初始化和撤销
1.派生类对象的初始化 在派生类对象中包含一个匿名的基类对象,在创建和初始化派生类对象 时,系统按照一定的顺序进行:先初始化该匿名的基类对象,然后再初始化派生 类自己的新增成员。 匿名基类对象的初始化由基类的构造函数来完成,派生类的构造函数会 调用基类的构造函数来完成匿名基类对象的初始化,默认情况是调用基类无参数 的构造函数,如果要调用其他带参数的构造函数,则必须在派生类构造函数的成 员初始化列表中指出。派生类构造函数的一般格式为:
name offertel dept no sal specialty一
Programmer类对象内存影像
5
8.2.2 继承方式以及派生类成员的访问
从基类继承的成员也可能会在两个地方被访问:①在派生类内部,派 生类新增的函数可能会访问从基类继承的成员。②在派生类的外部,通过派生 类对象来访问从基类继承的成员。对从基类中继承的成员的访问,受到其在派 生类中的访问控制方式的限制,而基类的成员在派生类中的访问权限由该成员 在基类中的访问控制方式和派生类的继承方式共同决定的。 继承方式在定义派生类时指出,如未指出,则默认为private。继承方 式对基类成员在派生类中的访问控制方式的影响如表所示。
A B
C 图8-5 多级继承关系
Байду номын сангаас
13
8.3 多重继承
14
8.3.1 多重继承的定义
在定义多重继承的派生类时,需要给出两个或两个以上的直接基类,其格式为: class <派生类名>:[<继承方式>]<基类名>,[<继承方式>]<基类名>,......{ <派生类新增成员说明表> }
C++教程第08章 继承与派生-1-4
第8章继承与派生8-1. 教学目的与要求1.理解继承的概念;2.掌握继承的实现方法;3.继承中常见问题的处理方法。
8-2. 主要内容及重点:类是C++中进行数据封装的逻辑单位。
继承是面向对象程序设计的一个重要特征之一,它允许在既有类的基础上创建新的类,新类可以从一个或多个既有类中继承操作和数据,而且可以重新定义或加进新的数据和操作,从而形成类的层次或等级。
既有类称为基类或父类,在它基础上建立的新类称为派生类、导出类或子类。
本章的重点是派生类的定义和使用、创建派生类对象时构造函数的调用顺序、多重继承中的冲突及其消除方法以及作用域运算符的几种使用方法等。
本章的难点是基类的初始化、多重继承中的冲突以及虚基类等。
8-3. 第8章继承-课件3-4. 8-4. 第8章继承-复习总结继承是面向对象程序设计方法的基本特性之一,继承可以提高软件的重要性。
本章主要介绍了C++中的继承性的实现方法以及在继承性常见问题的处理方法。
包括基类的初始化、访问类型的调整、冲突及其消除方法、成员覆盖、赋值兼容性以及虚基类等。
类的派生包括三种类型:私有派生、保护派生、公有派生。
利用构造函数的初始化成员列表,可以在派生类中对基类成员进行初始化。
在继承层次关系中要避免冲突的产生,通常是采用指定作用域和定义虚基类这两种方法来解决问题。
8-5. 第8章继承-练习8-5-1.思考题:1).派生类有几种方式,每种方式中派生类对基类成员的继承如何?2). 在创建派生类对象时,构造函数的执行次序是怎样的?析构函数的执行次序是怎样的?3). 派生类对象如何对基类中的成员进行初始化?4). 在多重继承中,在什么情况下会产生冲突?如何消除冲突?5). 列举我们已学习的作用域运算符“::”的所有用途。
6). 属于不同类的对象在什么情况下可以互相赋值?7).什么叫虚基类?为什么要引进虚基类?8-5-2.练习题:课后练习题见练习单元。
类是C++中进行数据封装的逻辑单位。
第八章 继承与多态习题(C++)
第八章继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。
(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。
如果强制转换则要注意(6)。
答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。
公有派生可以使其类的(4),所以公有派生是主流。
答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.3 利用继承能够实现(1)。
这种实现缩短了程序开发的时间,VC++中的(2)很好地体现了这一点。
答案:(1)代码的复用(2)MFC编程8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。
继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。
答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.5 C++中多态性包括两种多态性:(1)和(2)。
前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。
答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.1.6 在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和(3)完全一样就认为是虚函数,而不必再加关键字(4)。
如有任何不同,则认为是(5)而不是虚函数。
除了非成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。
答案:(1)同虚函数名(2)同参数表(3)同返回类型。
如基类中返回基类指针,而派生类中返回派生类指针是允许的(4)virtual(5)重载(6)静态成员函数(7)内联函数(8)构造函数8.1.7 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质是将指向函数体的指针定为(3)。
C++面向对象程序设计第八章继承与派生
13
8.4
派生类的构造函数与析构函数
在产生新的对象时, 都会调用相应的构造函数。 构造函数的作用有两点: (1)为成员变量分配存储空间。 (2)初始化成员变量的值。 派生类的构造函数? 析构函数? 基类的构造函数和析构函数是不能被继承的!
14
8.4.1简单派生类的构造函数
25
8.7继承与组合
在实际的程序开发过程中,使用面向对象的方 法,在建立新类的时候,要弄清新类与已有类 之间的关系 看究竟是 看究竟是ISA关系还是HASA关系? 关系还是 关系? 如果是ISA关系,就要通过继承来产生新的类 如果是HASA关系,就要通过组合来产生新的类
【例8.14】继承与组合示例 】
21
8.5.3多重继承的问题 【例8.10】 多重继承的问题 】
解决的办法之一:在处理变量时通过 基类名加上域作用符的方式 指明要操作的究竟是哪个变量 这样即不符合现实,还浪费了存储空间 解决的办法之二: 采用 虚基类
22
8.5.4虚基类
在继承时通过关键字virtual声明为虚继承, 相应的基类就成了虚基类。
6
8.2
派生类的声明方式及构成
比较这个定义和上一节中给出的undergraduate 定义,很容易发现继承的写法: 默认为private私 默认为 私
有继承 基类名1, 基类名2, class 子类名 : 继承方式 基类名 ,继承方式 基类名 , [继承方式] 父类名 …继承方式 基类名 继承方式 基类名n { 继承方式可以是 public(公有继承) (公有继承) 类的定义体 private(私有继承) (私有继承) protected(保护继承) (保护继承) };
第八章C++的继承与派生
C++类的继承与派生继承是面向对象程序设计中最重要的机制。
(主要表现为通过一个已有的类能派生出一个新的类)派生其他类的类称为基类或父类。
被派生的新类叫做派生类或子类;派生类不仅继承基类所有的成员而且可以添加新的成员和成员函数,派生类能继承基类的功能。
而且还能添加和改变它的功能。
一种是从基类继承的成员,另一种是添加的成员。
其包括数据成员和成员函数。
单继承派生类的定义格式Class 派生类名:继承方式基类名{派生类新增成员的声明};单继承派生类的声明“:”左右分别为派生类类名和基名:“{}”里面为了类新建的成员派生类的构成(构造函数和析构函数不能被继承,所以在派生类中还需要定义自己的析构函数和构造函数、如果基类含有带参数的构造函数,在派生类的构造函数中先要调用基类的构造函数,使基类中的数据成员首先被初始化)其继承方式有3中:共有继承(public)、私有继承(private)、保护继承(protected)中,某些数据成员和成员函数的访问权限会改变(如公有的成员有可能变成私有成员)但是不管用哪种方式继承都不能将某一成员排除在派生类之外。
派生类还可以定义和基类一模一样的函数(函数名和参数名都一样),覆盖基类中的同名函数。
派生类不仅继承基类的成员,还需要添加自己的成员,从而具有自己的特性,这些成员的定义和基类中的成员定义方式是一样的,可以是共有继承,私有继承、保护继承。
派生类可以向基类对象赋值派生类对象可以替代基类对象向基类对象的引用进行赋值或初始化如果一个函数是基类对象或基类对象的引用,相应的实参可以用子类型对象派生类对象的地址可以赋给指向基类对象的指针变量派生类定义格式Class 派生类:继承方式基类名{Private:派生类中新增加的私有数据成员派生类中新增加的私有成员函数Public:派生类中新增加的公有数据成员派生类中新增加的公有成员函数Protected:派生类中新增加的私有数据成员派生类中新增加的公有成员函数}(派生类的定义和一般类的定义方式很相似,都是以关键字class开头,在类体中都可以包含私有成员函数、公有成员函数、保护成员,其区别在于派生类的定义在派生类名后面用冒号“:”引导继承方式和基类名)。
C++面向对象程序设计第8章 继承与派生
cout<<m_strName<<"\t"<<m_ nSex<<"\t"<<m_strDept<<"\n "; } };
蚌埠学院计算机系
12
C++面向对象程序设计
8.3
8.3.1 public派生
三种派生方式
以公有继承方式创建的派生类对基类各种成员的访问权限 如下: ⑴基类公有成员相当于派生类的公有成员,即派生类可以像 访问自身的公有成员一样访问基类的公有成员。
1c面向对象程序设计第八章继承和派生c面向对象程序设计蚌埠学院计算机系2学习目标理解继承与派生的概念掌握派生类的定义格式理解派生类成员的来源掌握三种不同继承方式对基类成员派生类成员访问权限的影响熟悉单一继承方式下派生类构造函数和析构函数的书写格式执行顺序了解多重继承方式下派生类构造函数和析构函数的书写格式执行顺序了解二义性问题产生的原因掌握虚基类的定义及应用c面向对象程序设计蚌埠学院计算机系381为什么要引入继承的概念?面向对象程序设计十分强调软件的可重用性其重要特征继承是软件复用的一种重要形式
蚌埠学院计算机系
19
C++面向对象程序设计
8.4
三种派生方式的区别
采用public公有派生,基类成员的访问权限在派生类中保 持不变,即基类所有的公有或保护成员在派生类中仍为公 有或保护成员。public派生最常用,可以在派生类的成员 函数中访问基类的非私有成员,可通过派生类的对象直接 访问基类的公有成员。 采用private私有派生,基类所有的公有和保护成员在派 生类中都成为私有成员,只允许在派生类的成员函数中访 问基类的非私有成员。private派生很少使用。 采用protected保护派生,基类所有的公有和保护成员在 派生类中都成为保护成员,只允许在派生类的成员函数和 该派生类的派生类的成员函数中访问基类的非私有成员。
c 继承与派生练习题
c 继承与派生练习题C++是一种面向对象的编程语言,其中最重要的概念之一就是继承与派生。
继承允许一个类(称为派生类)从另一个类(称为基类)中继承属性和行为。
这个过程允许我们在派生类中使用基类的成员,同时还可以添加新的成员或者修改基类成员的行为。
在这篇文章中,我们将通过一些练习题来巩固与继承与派生有关的概念和技能。
这些练习题旨在帮助读者更好地理解和应用这些概念。
首先,考虑一下以下的代码段:```cppclass Shape {protected:int width, height;public:Shape(int w, int h) : width(w), height(h) {}virtual int area() = 0;};class Rectangle : public Shape {public:Rectangle(int w, int h) : Shape(w, h) {}int area() override { return width * height; }};class Triangle : public Shape {public:Triangle(int w, int h) : Shape(w, h) {}int area() override { return (width * height) / 2; }};```通过观察上述代码,我们可以看到Shape是一个基类,其派生类有Rectangle和Triangle。
这些派生类通过公有继承的方式继承了Shape类的成员。
另外,注意到Shape类中的区域函数area()被声明为纯虚函数。
接下来,我们通过一些练习题来检验对继承和派生的理解。
练习题1:向Shape的派生类中添加新的成员在给定的代码段中,尝试向Rectangle和Triangle类中添加一个新的成员,例如颜色color。
然后,尝试在main()函数中创建一个Rectangle对象和一个Triangle对象,并打印出它们的属性(包括颜色)和区域。
