c++多重继承试题
国家二级C++机试(继承和派生)模拟试卷8(题后含答案及解析)

国家二级C++机试(继承和派生)模拟试卷8(题后含答案及解析) 题型有:1. 选择题选择题1.有如下类定义:class AA{ int a:public:AA(intn=0):a(n){} };class BB:public AA{ public:BB(int n)____ };其中横线处缺失部分是( )。
A.:a(n){}B.:AA(n){}C.{a(n);}D.{a=n;}正确答案:B解析:根据派生类构造函数的一般格式:<派生类名>(<总参数表>):<基类名1>(<参数表1>),…<基类名n><参数表n>),<成员对象名1>(<参数表n+1>),<成员对象名m>(<参数表n+m>)<派生类构造函数体>。
在派生类BB的构造函数总参数表后面应该接上基类名AA和其参数。
知识模块:继承和派生2.有如下程序:#inc1ude <iostream>using namespace std;class Basel{ public:Basel(int d) {cout<<d;} ~Basel( ){} };class Base2{ public:Base2(int d) {cout<<d;} ~Base2( ){} };class Derived:public Basel,Base2{ public:Derived (int a,int b,int c,int d);Basel(b),Base2(a),bl(d),b2(c) {} Private:int b1;int b2;};int main( ){ Derived d(1,2,3,4);retum 0;} 运行时的输出结果是( )。
A.1234B.2134C.12D.21正确答案:D解析:程序在创建派生类对象d时,分别调用基类Basel和Basel的构造函数。
知识模块:继承和派生3.已知基类Employee只有一个构造函数,其定义如下:Employee::Employee(int n):id(n){} Manager是Employee的派生类,则下列对Manager 的构造函数的定义中,正确的是( )。
经典c++试题及答案

经典c++试题及答案经典C++试题及答案一、选择题1. 在C++中,哪个关键字用于定义类?A. FunctionB. ClassC. StructD. Interface答案:B2. 下列哪个是C++标准库中的容器?A. ListB. QueueC. VectorD. All of the above答案:D3. C++中的虚函数主要用于实现什么?A. 重载B. 覆盖C. 隐藏D. 多态答案:D4. 在C++中,以下哪个操作符用于重载?A. newB. deleteC. operatorD. overload答案:C5. C++中的const关键字有什么作用?A. 表示一个整型常量B. 表示一个指针常量C. 表示一个函数不能修改其参数D. 表示一个类成员变量不可变答案:D二、填空题1. 在C++中,_______关键字用于声明一个函数或变量只能在其定义的文件内部访问。
答案:static2. C++中的引用是_______类型的别名。
答案:变量3. 使用_______运算符可以对类进行拷贝。
答案:=4. C++中的_______关键字用于实现多重继承。
答案::5. 析构函数是_______构造函数。
答案:没有三、简答题1. 请简述C++中的友元(friend)的概念。
答案:在C++中,友元是指允许一个类或函数访问另一个类的私有(private)或保护(protected)成员的机制。
通过将一个函数或类声明为另一个类的友元,可以打破类的封装性,允许外部函数或类访问其内部数据。
2. 解释C++中的异常处理机制。
答案:C++中的异常处理机制允许程序在执行过程中捕获并处理错误。
它包括三个主要的关键字:try、catch和throw。
try块用于包围可能抛出异常的代码,catch块用于捕获并处理异常,throw用于抛出一个异常。
异常处理机制可以帮助程序在遇到错误时恢复或继续执行,而不是立即终止。
四、编程题1. 编写一个C++程序,实现一个简单的类,该类包含一个私有整型成员变量,并提供公共的访问器(getter)和修改器(setter)函数。
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++的封装、继承和多态C++是一种功能强大的编程语言,具有面向对象的特性。
其中的封装、继承和多态是面向对象编程的三大基本概念。
本文将介绍C++中封装、继承和多态的概念和用法。
封装封装是面向对象编程中的一种重要特性,它将数据和对数据的操作封装在一个类中。
通过封装,我们可以隐藏类内部的实现细节,只向外界暴露必要的接口。
这样可以提高代码的可维护性和安全性。
在C++中,我们使用类来实现封装。
一个类由数据成员和成员函数组成。
数据成员表示类的状态,而成员函数用于对数据进行操作和访问控制。
例如,我们定义一个名为Person的类,它有私有的数据成员name和age,以及公有的成员函数getName和getAge:class Person {private:string name;int age;public:string getName() {return name;}int getAge() {return age;}};通过将数据成员定义为私有,我们限制了对这些数据的直接访问。
外部只能通过公有的成员函数来间接地访问和修改数据。
这样可以保证数据的安全性和完整性。
继承继承是面向对象编程中的另一个重要特性,它允许一个类从另一个类中继承属性和方法。
通过继承,我们可以使用已有类的功能,同时可以在子类中添加或修改功能,实现代码的重用和扩展。
在C++中,使用关键字class后面跟上继承类的名称来实现继承。
例如,我们定义一个名为Student的子类,它从Person类继承属性和方法:class Student : public Person {private:int studentId;public:int getStudentId() {return studentId;}};子类Student继承了父类Person的属性和方法。
在子类中,我们可以添加新的数据成员和成员函数,或者重新实现父类的成员函数,以满足子类的需求。
C++(练习)第8章,继承与派生

C++(练习)第8章,继承与派生一,单选题1.下列描述中错误的是( )。
A 继承分为多重继承和单继承B 对象间通信靠传递消息实现C 在外面看不到对象的内部特征是基于对象的"模块独立性好"这个特征D 类是具有共同属性、共同方法的对象的集合参考答案C2. 设有以下定义:#includeclass A1{public:void show1() { cout<<"class A1"<<="">};class A2: public A1{public:void show2( ) { cout<<"class A2"<<="">};class A3: protected A2{public:void show3( ) { cout<<"class A3"<<="">};void main(){A1 obj1;A2 obj2;A3 obj3;...}以下不合法的调用语句是( )。
A obj1.show1();B obj2.show1();C obj3.show1();D obj2.show2();参考答案C3. 下列描述中哪个是正确的__________。
A 私有派生的子类无法访问父类的成员B 类A的私有派生子类的派生类C无法初始化其祖先类A对象的属性,因为类A的成员对类C是不可访问的C 私有派生类不能作为基类派生子类D 私有派生类的所有子孙类将无法继续继承该类的成员参考答案B4. 下面有关派生类的说法中,错误的是( )。
A 一个派生类可以作为另一个派生类的基类B 一个派生类可以有多个基类C 派生类构造函数可以将初始化参数值传递给基类的构造函数和对象成员的构造函数D 具有继承关系时,基类成员在派生类中的访问权限不变参考答案D5. 设置虚基类的目的是( )。
c++多重继承试题

(一)选择填空:(1) 下列对派生类的描述中,( )是错误的。
A. 一个派生类可以用作另一个派生类的基类。
B. 派生类至少应有一个基类。
C. 基类中成员被派生类继承后其映射的访问权限并无变化。
D. 派生类对象的栈区内存存储内容中除了本类部分的所有非静态数据成员外,还首先包含了它的基类部分的所有非静态数据成员。
(2) 主函数main可以访问派生类的对象中哪一类映射的基类成员?( )A. 公有继承的基类部分的公有成员。
B. 公有继承的基类部分的保护成员。
C. 公有继承的基类部分的私有成员。
D. 保护继承的基类部分的公有成员。
(3) 多继承派生类建立对象时,( )被最先调用。
A. 派生类自己的构造函数。
B. 祖先虚基类的构造函数。
C. 祖先非虚的基类的构造函数。
D. 派生类中子对象的构造函数。
(4)下列关键字中,( )不是类定义中使用的关键字:A.classB.publicC.switchD.private(二)判断下列描述的正确性,对者划√,错者划,错者划者划(1) C++语言中,允许单继承,也允许多继承。
(2) 派生类不能再派生出新的派生类。
(3) 在公有继承中,派生类对象的成员函数可以访问基类部分中的私有成员。
(4) 在公有继承中,派生类对象的成员函数不可以访问基类部分中的保护成员。
(5) 在私有继承中,派生类对象的成员函数不可以访问基类部分中的公有成员。
(6) 在保护继承中,派生类对象的成员函数可以访问基类部分中的保护成员。
(7) 用class定义的类中,缺省的访问权限是公有的。
s定义的类中,缺省的访问权限是公有的。
(1)义的类中,缺省的访问权限是公有的。
(三)写出以下程序运行结果// exer_ch4_3.cpp#include<iostream.h>class A{int a,b;public:A(int i, int j){a=i; b=j;}void Move(int x, int y){a+=x; b+=y;}void Show( ){cout<<"("<<a<<", "<<b<<")"<<endl;}};class B : public A{int x, y;public:B(int i, int j, int k, int l) : A(i, j){x=k; y=l;}};void main( ){A a(1, 2);B b(3, 4, 5, 6);b.Move(7, 8);b.Show( );}(四)该表找出程序中错误语句,修改后显示运行结果。
c++ 封装 继承 多态 面试题

c++ 封装继承多态面试题C++是一种非常强大和流行的编程语言,很多公司在面试C++开发者时都会考察面试者对C++的封装、继承和多态的理解。
这三个概念是面向对象编程(OOP)的基础,了解它们的概念和实现方式对于成为一名优秀的C++开发者至关重要。
1.封装封装是一种将数据和相关的操作方法封装在一起的编程原则,它是实现面向对象编程的重要特性之一。
封装有助于提高代码的可维护性和可重用性,同时减少代码的复杂性。
封装的核心思想是将数据和操作数据的方法组合在一个模块(类)中,通过访问权限控制来保护数据的完整性和一致性。
C++中,我们可以通过访问说明符(private、protected、public)来控制成员变量和成员函数的访问权限。
下面是一个简单的例子,演示了如何使用类进行封装:```cppclass Car {private:int speed;public:void setSpeed(int s) { if (s > 0) {speed = s;}}int getSpeed() {return speed;}};```在上面的例子中,我们使用类Car封装了一个私有成员变量speed 和两个公有成员函数setSpeed和getSpeed,这样来控制访问speed变量的方式。
通过封装,我们可以对外隐藏具体的实现细节,只暴露必要的接口。
2.继承继承是一种代码重用的机制,它允许我们创建一个新类(派生类),该类可以继承现有类(基类)的属性和行为。
继承是实现面向对象编程中代码复用的重要手段。
C++支持单继承和多继承,派生类可以继承基类的公有和保护成员,但无法继承基类的私有成员。
同时,派生类可以重写基类的成员函数,并且可以增加新的成员变量和成员函数。
下面是一个简单的继承例子:```cppclass Animal {public:void eat() {cout << "Animal is eating" << endl;}};class Cat : public Animal {public:void meow() {cout << "Cat is meowing" << endl;}};```在上面的例子中,派生类Cat继承了基类Animal的成员函数eat,并增加了自己的成员函数meow。
11.15C++多重继承的二义性问题

多重继承可以反映现实生活中的情况,能够有效地处理一些较复杂的问题,使编写程序具有灵活性,但是多重继承也引起了一些值得注意的问题,它增加了程序的复杂度,使程序的编写和维护变得相对困难,容易出错。
其中最常见的问题就是继承的成员同名而产生的二义性(ambiguous)问题。
如果类A和类B中都有成员函数display和数据成员a,类C是类A和类B的直接派生类。
分别讨论下列3种情况。
1) 两个基类有同名成员代码如下所示:.class A.{.public:.int a;.void display();.};..class B.{.public:.int a;.void display ();.};..class C: public A, public B.{.public:.int b;.void show();.};如果在main函数中定义C类对象cl,并调用数据成员a和成员函数display :C cl;cl.a=3;cl.display();由于基类A和基类B都有数据成员a和成员函数display,编译系统无法判别要访问的是哪一个基类的成员,因此程序编译出错。
那么,应该怎样解决这个问题呢?可以用基类名来限定:cl.A::a=3; //引用cl对象中的基类A的数据成员acl.A::display(); //调用cl对象中的基类A的成员函数display如果是在派生类C中通过派生类成员函数show访问基类A的display和a,可以不必写对象名而直接写A::a = 3; //指当前对象A::display();2) 两个基类和派生类三者都有同名成员将上面的C类声明改为:class C: public A, public B{int a;void display();};如果在main函数中定义C类对象cl,并调用数据成员a和成员函数display:C cl;cl.a = 3;cl.display();此时,程序能通过编译,也可以正常运行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(一)选择填空:
(1) 下列对派生类的描述中,( )是错误的。
A. 一个派生类可以用作另一个派生类的基类。
B. 派生类至少应有一个基类。
C. 基类中成员被派生类继承后其映射的访问权限并无变化。
D. 派生类对象的栈区内存存储内容中除了本类部分的所有非静态数据成员外,还首先包含了它的基类部分的所有非静态数据成员。
(2) 主函数main可以访问派生类的对象中哪一类映射的基类成员?( )
A. 公有继承的基类部分的公有成员。
B. 公有继承的基类部分的保护成员。
C. 公有继承的基类部分的私有成员。
D. 保护继承的基类部分的公有成员。
(3) 多继承派生类建立对象时,( )被最先调用。
A. 派生类自己的构造函数。
B. 祖先虚基类的构造函数。
C. 祖先非虚的基类的构造函数。
D. 派生类中子对象的构造函数。
(4)下列关键字中,( )不是类定义中使用的关键字:
A.class
B.public
C.switch
D.private
(二)判断下列描述的正确性,对者划√,错者划
,错者划
者划
(1) C++语言中,允许单继承,也允许多继承。
(2) 派生类不能再派生出新的派生类。
(3) 在公有继承中,派生类对象的成员函数可以访问基类部分中的私有成员。
(4) 在公有继承中,派生类对象的成员函数不可以访问基类部分中的保护成员。
(5) 在私有继承中,派生类对象的成员函数不可以访问基类部分中的公有成员。
(6) 在保护继承中,派生类对象的成员函数可以访问基类部分中的保护成员。
(7) 用class定义的类中,缺省的访问权限是公有的。
s定义的类中,缺省的访问权限是公有的。
(1)义的类中,缺省的访问权限是公有的。
(三)写出以下程序运行结果
// exer_ch4_3.cpp
#include<iostream.h>
class A
{
int a,b;
public:
A(int i, int j)
{a=i; b=j;}
void Move(int x, int y)
{a+=x; b+=y;}
void Show( )
{cout<<"("<<a<<", "<<b<<")"<<endl;}
};
class B : public A
{
int x, y;
public:
B(int i, int j, int k, int l) : A(i, j)
{x=k; y=l;}
};
void main( )
{
A a(1, 2);
B b(3, 4, 5, 6);
b.Move(7, 8);
b.Show( );
}
(四)该表找出程序中错误语句,修改后显示运行结果。
#include <iostream.h>
class A
{
protected:
void f( int a ) { cout<< a << endl; }
void g( ) { cout<< "g( )" << endl; }
};
class B: A //[private]
{
public:
void h( ) { cout<< "h( )" << endl; }
};
void main( )
{
B objb;
objb.f(5);
objb.g( );
objb.h( );
}
(五)以下程序中,有些类只定义了构造函数,另有些类只定义了析构函数,请写出其运行结果:
// exer_ch4_5.cpp
#include <iostream.h>
class B
{
public:
B( ) { cout<<"CONS_B"<<endl; }
};
class V: public B
{
public:
~V( ) { cout<<"DES_V"<<endl; }
};
class X: virtual public V
{
public:
X( ) { cout<<"CONS_X"<<endl; }
~X( ) { cout<<"DES_X"<<endl; }
};
class Y: virtual public V
{
public:
Y( ) { cout<<"CONS_Y"<<endl; }
};
class W : public Y, public X继承顺序不同调用构造函数的顺序就不同{
public:
~W( ) { cout<<"DES_W"<<endl; }
};
class Z : public W
{
public:
~Z( ) { cout<<"DES_Z"<<endl; }
};
void main()
{
Z obj;
}
(七)写出程序运行结果
#include <iostream.h>
class A
{ protected: int ia;
public: A(int j) { ia=j; cout<<"A"<<ia<<endl; } };
class B: public A
{ protected: int ib;
public: B(int j, int k) : A(k) { ib=j; cout<<"B"<<ib<<endl; } };
class M
{ protected: int im;
public: M(int j) { im=j; cout<<"M"<<im<<endl; } }; class C: B
{ protected: int ic;
M objm;
public: C(int j, int k, int m, int n) : B(k, n),objm(m) { ic=j;
cout<<"C"<<ic<<endl; } };
void main ( ) { C objc(1, 2, 3, 4); }。