文档库 最新最全的文档下载
当前位置:文档库 › 声明一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有GetArea

声明一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有GetArea

声明一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有GetArea
声明一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有GetArea

声明一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有GetArea

//定义一个Shape基类,在此基础上派生出Rectangle和Circle类,二者都有GetArea()函数计算对象的面积。

//使用Rectangle类创建一个派生类Square。并应用相应类的对象测试。

#include

class Shape

{

public:

Shape(){}

~Shape(){}

virtual float GetArea() const {return -1;}

};

class Circle :public Shape

{

public:

Circle(float r) :radius(r){}

~Circle(){};

float GetArea(){return 3.14f*radius*radius;}

private:

float radius;

};

class Rectangle :public Shape

{

public:

Rectangle(float len, float width):m_len(len), m_width(width){}

~Rectangle(){}

float GetArea(){return m_len*m_width;}

float GetLength(){return m_len;}

float GetWidth(){return m_width;}

private:

float m_len,m_width;

};

class Square: public Rectangle

{

public:

Square(float len);

~Square(){}

};

Square::Square(float len):Rectangle(len,len)

{}

void main()

{

Shape *sp;

sp=new Circle(5);

cout<<"The area of the circle is"<GetArea()<

sp=new Rectangle(4,6);

cout<<"The area of the rectangle is"<GetArea()<

sp=new Square(5);

cout<<"The area of the Square is"<GetArea()<

}

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.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为 (2)。继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。 答案:(1)单继承 (2)多重继承 (3)层次 (4)单继承 8.1.6 C++中多态性包括两种多态性:(1)和(2)。前者是通过(3)实现的, 而后者是通过(4)和(5)来实现的。 答案:(1)编译时的 (2)运行时的 (3)函数和运算符的重载 (4)类继承关系 (5)虚函数 8.2简答题(以下习题题号可能和教材不一致!) 8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。派生类构造函数各部分的执行次序是: 1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。 2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。 3.派生类的构造函数体中的操作。 8.2.2什么叫派生类的同名覆盖(override)?

C++ 基类和派生类

C++ 基类和派生类 9/4/2001 8:37:5· ·--··https://www.wendangku.net/doc/1517661333.html, 本讲讨论基类和派生类的基本概念。 通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。 在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。 派生类的定义格式 单继承的定义格式如下: class <派生类名>:<继承方式><基类名> { <派生类新定义成员> }; 其中,<派生类名>是新定义的一个类的名字,它是从<基类名>中派生的,并且按指定的<继承方式>派生的。<继承方式>常使用如下三种关键字给予表示: public 表示公有基类; private 表示私有基类; protected 表示保护基类; 多继承的定义格式如下: class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,… { <派生类新定义成员> }; 可见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于一个。 派生类的三种继承方式

公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。 2. 私有继承(private) 私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。 3. 保护继承(protected) 保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。 下面列出三种不同的继承方式的基类特性和派生类特性。 不同继承方式的基类和派生类特性 继承方式基类特性派生类特性 公有继承public public protected private protected 不可访问 私有继承public private protected private private 不可访问 保护继承public protected protected private protected 不可访问 为了进一步理解三种不同的继承方式在其成员的可见性方面的区别,下面从三种不同角度进行讨论。 对于公有继承方式: (1) 基类成员对其对象的可见性:

概念介绍与派生类的声明

一.继承与派生的概念 在之前的教程中我们学习了类的抽象性、封装性以及数据的共享等以后,我们就可以对于现实中的问题进行抽象和处理了。但是面向对象设计中代码的复用性和扩展性还没有体现出来。对于某个问题前人已经有了既有成果,我们怎样不做重复性劳动而直接运用?在问题有了新的发展以后我们怎样快速高效的修改或扩展现有的程序?这些都可以通过类的继承与派生来解决。 类是对现实中事物的抽象,类的继承和派生的层次结构则是对自然界中事物分类、分析的过程在程序设计中的体现。下图说明了某个公司雇员的派生关系。位于最高层的雇员其抽象程度最高,是最具一般性的概念。最下层抽象程度最低,最具体。从上层到下层是具体化的过程,从下层到上层是抽象话的过程。面向对象设计中上层与下层是基类与派生类的关系。 我们看到上图中此公司的雇员有三类:兼职技术人员、管理人员和销售人员。每个雇员都有姓名、级别和薪水等信息。每种雇员都可以升级,但升级方式不同。他们的月薪计算方式也不同,兼职技术人员应按实际工作小时数领取月薪,管理人员领取固定月薪,而销售人员是根据当月销售额领取提成。 这三类雇员的升级方式和月薪的计算方法等不同,所以不能用同一个类来描述,需要有三个类来分别抽象三类雇员。但这三个类中又有很多数据成员是一样的,例如姓名、级别和薪水等,函数成员也有很多相同的,只是可能实现方法不同,例如升级函数和计算月薪函数等 我们应该先描述所有雇员的共性,再分别描述每类雇员。分别描述时应先说明他是雇员,然后描述他特有的属性和处理方法。这种描述方法在面向对象设计中就是类的继承与派生。对雇员共性进行描述就形成了基类,而对每类雇员的特性的描述可以通过从基类派生出子类来实现。 类的继承就是新类由已经存在的类获得已有特性,类的派生则是由已经存在的类产生新类的过程。这两个概念是两个相对的方向上的。 由已有类产生新类时,新类会拥有已有类的所有特性,然后又加入了自己独有的新特性。已有类叫做基类或者父类,产生的新类叫做派生类或者子类。派生类同样又可以作为基类派生新的子类,这样就形成了类的层次结构。 二.派生类的声明 派生类声明的语法形式为: class 派生类名: 继承方式1 基类名1, 继承方式2 基类名2, ... 继承方式n 基类名n { 派生类成员的声明; } 例如,类Parent1和Parent2是已经声明过的类,类Child是由这两个类派生出的子类,则声明Child类的基本形式为: class Child : public Parent1, private Parent2 {

C++基类和派生类

本讲讨论基类和派生类的基本概念。 通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。 在C++(C++培训)++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从 多个基类派生的继承称为多继承。 派生类的定义格式 单继承的定义格式如下: class <派生类名>:<继承方式><基类名> { <派生类新定义成员> }; 其中,<派生类名>是新定义的一个类的名字,它是从<基类名>中派生的,并且按指定的<继承方式>派生的。<继承方式>常使用如 下三种关键字给予表示: public 表示公有基类; private 表示私有基类; protected 表示保护基类; 多继承的定义格式如下:

class <派生类名>:<继承方式1><基类名1>,<继承方式2><基 类名2>,… { <派生类新定义成员> }; 可见,多继承与单继承的区别从定义格式上看,主要是多继承的 基类多于一个。 派生类的三种继承方式 公有继承(public)、私有继承(private)、保护继承(protected)是常 用的三种继承方式。 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。 2. 私有继承(private) 私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。 3. 保护继承(protected) 保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的 私有成员仍然是私有的。 下面列出三种不同的继承方式的基类特性和派生类特性。 不同继承方式的基类和派生类特性

C#基类和派生类

C#基类和派生类(转) 1.基类和派生类的一些基本概念 class B : A{} A是基类,B是派生类. 一个类最多只允许从一个类中派生. class C : B{} B还可以充当C的派生类 继承总是隐式为public的,System.Object是所有类的根 编译器会把你的类悄悄的编译成class A : System.Object{} 2.调用基类的构造函数 class B : A { public B(string sqlstr) : base(sqlstr) {} } 3基类派生类对象之间的关系 class A{} class B : A {} class C: A {} B b = new B(); C c = b; //这样写是错误地,因为类型不同 A a = b; //这样写是正确的,但是一定要注意: 这样做有一个明显的限制a 对象只能访问基类中的成员不能访问派生类中的成员 这就是为什么C#完全面向对象的原因,因为C#中所有的东西都继承自System.Object,任何东西都能赋给一个object变量 4.方法的隐藏 如果一个基类有n个方法和n个派生类,这n个派生类里又分别有n个方法.你想过会出现什么问题吗?对!就是会遇到完全一样签名的方法(方法名\参数的数量\类型完全一样)如果出现这样的情况,在编译过程中将收到一个警告,不要惊慌,仅仅是警告而已,不会影响编译的过程. 但是你应该认真的对待这个警告,如果派生类的一个对象将调用基类的一个方法,然而这个方法又在这个派生类里有相同签名的方法!那编译器该怎么办? 我可以负责任的告诉你(呵呵): 对象调用的是派生类里的方法, 这种现象在微软官方叫方法的隐藏, 如果你不想看到那个警告,可以在派生类中与基类同签名的方法前面加个new关键字,告诉编译器:我会为我造成的结果负责,不要警告我!注意这个关键字只是起个屏蔽警告的作用,你明白我的意思吗?(派生类的对象照样还是不能调用基类中同签名的方法,呵呵,还是再补一句吧,) 5.方法的覆盖

C++继承与派生类习题

第九章继承与派生类 9.2 典型例题分析与解答 例题1:下列对派生类的描述中,()是错误的。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 答案:D 分析:一个派生类可以作为另一个派生类的基类。无论是单继承还是多继承,派生类至少有一个基类。派生类的成员除了它自己的成员外,还包含了它的基类成员。派生类中继承的基类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的public,protected成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。例题2:派生类的对象对它的哪一类基类成员是可以访问的?() A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员 C. 公有继承的基类的私有成员 D. 保护继承的基类的公有成员 答案:A 分析:公有继承的基类的公有成员在派生类中保持公有访问权限,所以派生类对象可以访问它;公有继承的基类的保护成员在派生类中保持保护访问权限,所以派生类对象不可以访问它;基类的私有成员不能被派生到派生类中,所以派生类对象不可以访问它;保护继承的基类的公有成员在派生类中变成保护的访问权限,所以派生类对象不可以访问它。 例题3:关于多继承二义性的描述,()是错误的。 A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性 B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性 C.解决二义性最常用的方法是作用域运算符对成员进行限定 D.派生类和它的基类中出现同名函数时,将可能出现二义性 答案:D 分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问共同基类的成员时可能出现二义性。消除二义性的方法是采用作用域运算符。派生类和它的基类中出现同名函数时,不可能出现二义性。 例题4:多继承派生类构造函数构造对象时,()被最先调用。 A.派生类自己的构造函数 B.虚基类的构造函数 C.非虚基类的构造函数 D.派生类中子对象类的构造函数 答案:B 分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,派生类中子对象类的构造函数,派生类自己的构造函数。 例题5: C++类体系中,能被派生类继承的是()。 A.构造函数 B.虚函数 C.析构函数 D.友元函数

C继承与派生类习题

第九章继承与派生类 9. 2 典型例题分析与解答 例题1:下列对派生类的描述中,()是错误的。 A—个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 答案:D 分析:一个派生类可以作为另一个派生类的基类。无论是单继承还是多继承,派生类至少有一个基类。派生类的成员除了它自己的成员外,还包含了它的基类成员。派生类中继承的基类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的 public ,protected 成员在派生类中作为private 成员;对于公有继承,基类的public ,protected 成员在派生类中访问属性不变;对于保护继承,基类的 public 、protected 成员在派生类中作为protected 成员。 例题2:派生类的对象对它的哪一类基类成员是可以访问的() A.公有继承的基类的公有成员 B.公有继承的基类的保护成员 C. 公有继承的基类的私有成员 D. 保护继承的基类的公有成员 答案: A 分析:公有继承的基类的公有成员在派生类中保持公有访问权限,所以派生类对象可以访问它;公有继承的基类的保护成员在派生类中保持保护访问权限,所以派生类对象不

可以访问它;基类的私有成员不能被派生到派生类中,所以派生类

对象不可以访问它;保护继承的基类的公有成员在派生类中变成保护的访问权限,所以派生类对象不可以访问它。 例题3:关于多继承二义性的描述,()是错误的。 A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二 义性 B.—个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公 共基类的访问可能出现二义性 C.解决二义性最常用的方法是作用域运算符对成员进行限定 D.派生类和它的基类中出现同名函数时,将可能出现二义性 答案:D 分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访 问共同基类的成员时可能出现二义性。消除二义性的方法是采用作用域运算符。 派生类和它的基类中出现同名函数时,不可能出现二义性。 例题4:多继承派生类构造函数构造对象时,()被最先调用。 A.派生类自己的构造函数 B.虚基类的构造函数 C.非虚基类的构造函数 D.派生类中子对象类的构造函数 答案:E 分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,派生类中子对象类的构造函数, 派生类自己的构造函数。 例题5: C++类体系中,能被派生类继承的是()。 A.构造函数 B.虚函数 C.析构函数 D.友元函数 答案:E 分析:C++类体系中,构造函数、析构函数和友元函数是不能被派生类继承的. 例题6:设有

派生类

继承与派生类 1 知识要点 1.掌握继承和派生的定义,派生类的定义方法。 (1)掌握继承的两种类型:单继承和多继承。 (2)掌握private,public,protected三种继承方式的特点。继承方式决定了基类中的成员在派生类中的属性。三种继承方式的共同点:基类的private成员在 派生类中不可见。区别:对于私有继承,基类的public、protected成员在派 生类中作为private成员;对于公有继承,基类的public、protected成员在派 生类中访问属性不变;对于保护继承,基类的public、protected成员在派生 类中作为protected成员。 (3)掌握派生类中的构造函数和析构函数的使用。基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。派生列的 构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员 的初始化通过基类构造函数来实现。 (4)掌握派生类的同名覆盖规则。 (5)掌握赋值兼容规则。基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类 类型指针可以指向派生类对象。 2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。 3.掌握虚基类的概念和定义方法。在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。 2 典型例题分析与解答 例题1:下列对派生类的描述中,()是错误的。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 答案:D 分析:一个派生类可以作为另一个派生类的基类。无论是单继承还是多继承,派生类至少有一个基类。派生类的成员除了它自己的成员外,还包含了它的基类成员。派生类中继承的基类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的public,protected成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。

继承与派生类知识要点

继承与派生类 知识要点 1.1.掌握继承和派生的定义,派生类的定义方法。 (1)掌握继承的两种类型:单继承和多继承。 (2)掌握private,public,protected三种继承方式的特点。继承方式决定了基类中的成员在派生类中的属性。三种继承方式的共同点:基类的private成员在派生类中不可见。 区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。 (3)掌握派生类中的构造函数和析构函数的使用。基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。 (4)掌握派生类的同名覆盖规则。 (5)掌握赋值兼容规则。基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。 2.2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定 的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明 顺序),最后执行派生类构造函数体中的内容。 3.3.掌握虚基类的概念和定义方法。在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多 个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。

c++派生类与继承实验报告

实验2 派生类与继承 实验课程名:面向对象程序设计(C++) 专业班级:学号:姓名: 实验时间:实验地点:指导教师: 2.1实验目的和要求 (1) 掌握派生类的声明方法和派生类构造函数的定义方法。 (2) 掌握不同继承方式下,基类成员在派生类中的访问属性。 (3) 掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。 (4) 学习虚基类在解决二义性问题中的作用。

二、实验内容 一、构造一个类Geometry 及其派生类,该类主要实现关于几何图形的基本操作。对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。 试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。 实验代码如下: #include using namespace std; class Geometry { public: Geometry(){} Circle radiums Circle() ~Circle() Ball Ball() ~Ball() Geometry Geometry() ~Geometry() GetArea() GetPerimeter() Getcolume() show() Column Column() ~Column() Rectangle Rectangle() ~Rectangle()

~Geometry(){} double GetArea(){}//求面积函数double GetPerimeter(){}//求体积函数double Getcolume(){}//求周长函数 virtual show(){} }; class Circle:public Geometry { public: Circle(double i) { radiums=i; } ~Circle(){} double GetArea(); double Getcolume(); double R() { return radiums; } show(); private:

继承和派生习题

继承和派生习题 一、单选题 1.若类A和类B的定义如下: class A { int i,j; public: int geti(){return i;} }; class B: public A { int k; public: void make(){k=i*j;} }; 则上述中,()是非法的表达式。 A.k=i*j B.int k; C.return i; D.void make(); 2.关于公有继承,下列说法错误的是()。 A.基类的公有成员和保护成员被继承后作为派生类的公有成员和保护成员。 B.派生类的其他成员可以直接访问基类的公有成员和保护成员。 C.派生类的对象可以访问基类的私有成员。 D.派生类成员和对象都无法访问基类的私有成员。 3.下列说法中错误的是()。 A.公有继承时基类中的public成员在派生类中仍是public的; B.公有继承时基类中的private成员在派生类中仍是private的; C.私有继承时基类中的public成员在派生类中是private的; D.保护继承时基类中的public成员在派生类中是protected的; 4.在公有继承中,基类中的公有成员作为派生类的()。 A.公有成员 B.私有成员 C.保护成员 D.私有成员函数 5.基类中的()不允许外界访问,但允许派生类的成员访问,这样既有一定的隐藏能力,又提供了开放的接口。 A.公有成员 B.私有成员 C.保护成员 D.私有成员函数 6.在下面的表达式中,不表示虚继承的是()。 A.virtual public

B.public virtual C.public D.virtual 7.设置虚函数的声明中,正确的是()。 A.简化程序 B.消除二义性 C.提高运行效率 D.减少目标代码 8.下面叙述错误的是()。 A.基类的protected成员在派生类中仍然是protected B.基类的protected成员在public派生类中仍然是protected的 C.基类的protected成员在private派生类中是private的 D.基类的protected成员不能被派生类的对象访问 9.派生类的对象对它的基类成员中()是可以访问的。 A.公有继承的公有成员 B.公有继承的私有成员 C.公有继承的保护成员 D.私有继承的公有成员 10.下列对派生类的描述中,错误的是()。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的缺省继承方式是private D.派生类只含有基类的公有成员和保护成员 11.继承具有(),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。 A.规律性 B.传递性 C.重复性 D.多样性 12.设有基类定义: class Cbase { private: int a; protected: int b; public: int c; }; 派生类采用何种继承方式可以使成员变量b成为自己的私有成员( ) A.私有继承 B.保护继承

5.2 基类和派生类

5.2 基类和派生类 在C++中,当一个类被其他类继承时,被继承的类称为基类(base class)。继承其他类特性的类称为派生类(derived class)。从本质上看,基类是具有一个类集合中的公共特性,派生类在继承基类特性的同时可以加入自己独有的特性。 基类与派生类之间反映出下述三种不同的现象: (1)派生类是基类的具体化。即模拟概念层次,表示“is-a”的关系。 (2)派生类是基类的延迟定义。 可以定义一个抽象基类,定义一些操作,使它们服从一定的协议,但许多可能并未实现,然后定义非抽象的派类,实现抽象基类中定义的行为。这时派生类不是基类的具体化,而是抽象类的实现。在JA V A中,有专门的纯虚类,称为接口,其作用就是为不同的类提供一个统一的接口,同时间接实现多继承(JA V A不支持多继承)。 (3)派生类是基类的结合。 当一个派生类有多于一个的基类时,它们组合在一起形成具有所有基类行为的类型。这时要注意,不要用继承表达聚合关系。 5.2.1 基类与派生类的说明 先看一个例子。 [例5.1] 派生类的说明EX5_1.CPP。 继承基类的派生类定义的一般形式: class derived_class_name:access_specifier base_class_name { …… }; 其中access_specifier可以是3个关键字之一:public、private(默认值)或protected。 派生类也称为子类、导出类。它具有下述特点: (1)可在基类所提供有基础上包含新成员; (2)可在自己类中隐藏基类的任何成员; (3)为新类重新定义基类中的函数; [例5.2] 子类的特点EX5_2.CPP。 5.2.2 派生类的继承权与访问域 派生类的继承权如果不能有效在加以限制,就不能按照实际情况表达求解问题的复杂性。因此访问权限是一个很重要的问题。 (1)对于基类的私有成员,派生类及派生类的使用者无权访问。 (2)对于基类的公有成员,则按派生类的定义,分为三种情况: ①私有派生,继承基类的公有成员作为自己的私有成员,这些成员只能被派生类的成员函数访问。Access_specifier是private或省略。 [例5.3] 私有派生EX5_3.CPP。

c++继承与派生习题答案

继承与派生 概念填空题 1.1在C++中,三种派生方式的说明符号为public、private、protected不加说明,则默认的派生方式为private。 1.2当公有派生时,基类的公有成员成为派生类的公有成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。当保护派生时,基类的公有成员成为派生类的保护成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。 1.3 派生类的构造函数一般有3项工作要完成:首先基类初始化,其次成员对象初始化,最后执行派生类构造函数体。 1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。在派生类中采用虚基类或作用域分辨符来消除该问题。 3.选择题 3.1下面对派生类的描述中,错误的是(D )。 A.一个派生类可以作为另外一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类的成员 D.派生类中继承的基类成员的访问权限到派生类中保持不变 3.2下列对友元关系叙述正确的是(A)。 A.不能继承 B.是类与类的关系 C.是一个类的成员函数与另一个类的关系 D.提高程序的运行效率 3.3当保护继承时,基类的(B)在派生类中成为保护成员,不能通过派生类的对象来直接访问。 A.任何成员B.公有成员和保护成员 C.公有成员和私有成员D.私有成员 3.4设置虚基类的目的是(B)。 A.简化程序B.消除二义性 C.提高运行效率D.减少目标代码 3.5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是(C )。 A.派生类的对象可以赋给基类的对象 B.派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 3.6有如下类定义: class MyBASE{ int k; public: void set(int n) {k=n;} int get( ) const {return k;}

c++派生类与基类的关系

基类对象与派生类对象的使用关系 1.派生类对象作为基类对象处理 由于派生类具有所有基类的成员,所以把派生类的对赋给基类对象是合理的,不过要求这种继承方式必须是public方式。但是,反过来赋值会使基类中一具有派生类的成员(因为派生类的成员通常是比基类的成员多),所以这是不允许的。 2.基类指针指向派生类对象 因为派生类对象也是基类对象,所以指向派生类对象的指针可以转换为指向基类对象的指针,这种引用方式是安全的,但是用这种方式只能引用基类成员。如果试图通过基类指针引用那些只有在派生类中才有的成员,编译系统会报告错误。 #include<> #include<> class Stud { char name[10]; int score; public: Stud(char na[],int s) { strcpy(name,na); score=s; } void disp() { cout<=90) cout<<"优"<=80) cout<<"良"<=70) cout<<"中"<=60)

cout<<"及格"<(&st1); p->disp(); p=dynamic_cast(&st2); p->disp(); } 3.派生类指针强制指向基类对象 直接用派生类指针指向基类的对象,这种方式会导致语法错误。但可以将派生类强制转换为基类指针,然后就可以调用基类的成员了。这种强制转换使用的静态转型运算符,其使用格式如下:

C继承与派生类习题

C继承与派生类习题文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

第九章继承与派生类 9.2 典型例题分析与解答 例题1:下列对派生类的描述中,()是错误的。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 答案:D 分析:一个派生类可以作为另一个派生类的基类。无论是单继承还是多继承,派生类至少有一个基类。派生类的成员除了它自己的成员外,还包含了它的基类成员。派生类中继承的基类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的public,protected成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。 例题2:派生类的对象对它的哪一类基类成员是可以访问的() A.公有继承的基类的公有成员B. 公有继承的基类的保护成员 C. 公有继承的基类的私有成员 D. 保护继承的基类的公有成员 答案:A 分析:公有继承的基类的公有成员在派生类中保持公有访问权限,所以派生类对象可以访问它;公有继承的基类的保护成员在派生类中保持保护访问权限,所以派生类对象不可以访问它;基类的私有成员不能被派生到派生类中,所以

派生类对象不可以访问它;保护继承的基类的公有成员在派生类中变成保护的访问权限,所以派生类对象不可以访问它。 例题3:关于多继承二义性的描述,()是错误的。 A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性 B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性 C.解决二义性最常用的方法是作用域运算符对成员进行限定 D.派生类和它的基类中出现同名函数时,将可能出现二义性 答案:D 分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问共同基类的成员时可能出现二义性。消除二义性的方法是采用作用域运算符。派生类和它的基类中出现同名函数时,不可能出现二义性。 例题4:多继承派生类构造函数构造对象时,()被最先调用。 A.派生类自己的构造函数B.虚基类的构造函数 C.非虚基类的构造函数D.派生类中子对象类的构造函数 答案:B 分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,派生类中子对象类的构造函数,派生类自己的构造函数。 例题5:C++类体系中,能被派生类继承的是()。 A.构造函数B.虚函数C.析构函数D.友元函数 答案:B

继承与派生类(我改的)

第九章继承与派生类 例题1:下列对派生类的描述中,( D )是错误的。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 例题2:派生类的对象对它的哪一类基类成员是可以访问的?( A ) A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员 C. 公有继承的基类的私有成员 D. 保护继承的基类的公有成员 例题3:关于多继承二义性的描述,( D )是错误的。 A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性 C.解决二义性最常用的方法是作用域运算符对成员进行限定 D.派生类和它的基类中出现同名函数时,将可能出现二义性 例题4:多继承派生类构造函数构造对象时,( B )被最先调用。 A.派生类自己的构造函数 B.虚基类的构造函数 C.非虚基类的构造函数 D.派生类中子对象类的构造函数 例题5: C++类体系中,能被派生类继承的是( B )。 A.构造函数 B.虚函数 C.析构函数 D.友元函数 例题6:设有基类定义: class Cbase { private: int a; protected: int b; public: int c; }; 派生类采用何种继承方式可以使成员变量b成为自己的私有成员( A ) A. 私有继承 B.保护继承 C. 公有继承 D.私有、保护、公有均可 例题7:C++将类继承分为单继承和多继承两种。 例题8:派生类可以定义其___ 基类____中不具备的数据和操作。 例题9:派生类构造函数的初始化列表中包含___初始化基类数据成员、新增内嵌对象数据及新增一般成员数据所需要的全部参数。 例题10:在继承机制下,当对象消亡时,编译系统先执行派生类的析构函数,然后才执行派生类中子对象类的析构函数,最后执行基类的析构函数。 例题11:设有以下类的定义: class A class B: protected A class C: private B { int A1; { int b1; { int c1; protected: int A2; protected: int b2; protected: int c2; public: int A3; public: int b3; public: int c3; }; }; }; 请按访问权限写出派生类C中具有的成员。 私有成员: c1、b2、b3、A2、A3

相关文档