南大面试高级程序设计继承_第1页
南大面试高级程序设计继承_第2页
南大面试高级程序设计继承_第3页
南大面试高级程序设计继承_第4页
南大面试高级程序设计继承_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

继承曹迎春如何理解C++中的继承?(1)如何理解C++中的继承?(2)注意:继承是从上到下的继承,不能将派生类的属性和行为赋给其基类。派生类不能继承基类的构造函数和析构函数。C++程序的继承结构是怎样的?(1)单继承:class

派生类名:访问控制修饰符基类名称{//派生类中的数据成员或函数成员}C++程序的继承结构是怎样的?(2)多重继承:class

派生类名:访问控制修饰符基类1,访问控制修饰符基类2,…,访问控制修饰符基类n{//派生类中的数据成员或函数成员}#include<iostream.h>class

A{//定义一个类A,并在该类中提供一个函数methodA()public:void

methodA(){cout<<"This

method

is

from

Class

A"<<endl;}};class

B{public:void

methodB(){cout<<"This

method

is

from

Class

B"<<endl;}};class

C:public

A,public

B{

//定义类C,继承类A和类Bpublic:void

methodC()

{methodA();//在类C中直接使用类A中的函数methodA()methodB();//在类C中直接使用类B中的函数methodB()}};void

main(){Cc;c.methodC();}当派生类与基类成员名称冲突时应如何解决?在C++程序中,如果遇到了派生类成员和基类成员的名称冲突的情况,程序会采用派生类成员执行相关操作。如果需要使用基类中的同名成员,则必须在程序中使用全局分辨符“::”来解决该问题。#include<iostream.h>classStudent{public:void

visit(void){//在基类中定义一个名为visit()的成员函数

cout<<"This

is

the

student

class"<<endl;}};class

Teacher:public

Student{public:void

visit(void)

{cout<<"This

is

the

teacher

class"<<endl;}};voidmain(void){Teacher

t;t.visit();

//直接访问visit函数

t.Student::visit();//使用全局分辨符访问visit函数}为什么要使用虚基类?(1)#include<iostream.h>//定义基类class

Base{public:int

i;};class

Base1:public

Base{//继承自类Basepublic:

int

j;};class

Base2:public

Base{//继承自类Basepublic:

int

k;};class

Derived:public

Base1,public

Base2{//继承类Base1和Base2public:

int

sum;};void

main(void)

{Derived

d; //创建Derived对象,并对参数i,j,k进行相关操作d.i=1;

d.j=2;

d.k=3; d.sum=d.i+d.j+d.k;cout<<"d.sum="<<d.sum<<endl;}为什么要使用虚基类?(2)虚基类就是在继承基类时加入virtual关键字,这样一来派

生类将继承虚基类,而应用中将会只存在一个基类的拷贝。…class

Base1:virtual

public

Base{public:int

j;};class

Base2:virtual

public

Base{public:int

k;};…为什么要使用虚基类?(3)注意:如果某个类继承自多个虚基类,程序执行时首先按照虚基类声明顺序调用各虚基类构造函数,然后调用派生类构造函数。如果同一继承层次中既有虚基类又有非虚基类,那么程序执行时会先调用虚基类构造函数,然后调用非虚基类构造函数,最后调用派生类构造函数。如果虚基类由非虚基类派生,那么程序执行时会先调用非虚基类的构造方法。如果虚基类中只包含带有参数的构造方法,那么继承该虚基类时必须提供相应参数。继承体系中构造函数的调用顺序是怎样的?(1)如果程序中存在继承关系,C++程序会首先调用基类中的构造函数,然后再调用派生类中的构造函数;如果是多重继承,程序将依次调用每个基类的构造函数,最后调用派生类中的构造函数,各基类构造函数的调用顺序取决于派生类所指定的基类顺序。class

C:public

A,publicB;#include<iostream.h>class

A{public:A(void){cout<<"constructor

in

Class

A\n";}};class

B{public:B(void){cout<<"constructor

in

Class

B\n";}};class

C:public

A,publicB{public:C(void):A(),B(){cout<<"constructor

in

Class

C\n";}};void

main(void){Cc;}继承体系中构造函数的调用顺序是怎样的?(2)注意:如果类中有成员类,成员类的构造函数被优先调用。创建子类的对象,父类的构造函数被优先调用。成员类对象的构造函数如果有多个成员类对象,构造函数的调用顺序是对象在类中声明的顺序。如果基类的构造函数有多个,构造函数的调用顺序是其在类派生表中出现的顺序。派生类的构造函数不能直接向基类的数据成员赋值,而

应该把值传递给适当的构造函数,由构造函数进行赋值。在继承中如何使用PUBLIC、PRIVATE以及PROTECTED关键字?public

公有继承基类中的公有成员在派生类中依然是公有的。基类中的保护成员在派生类中依然是保护的。基类中的私有成员或不可访问成员在派生类中依然是不可访问的。private

私有继承基类中的公有成员在派生类中变成了私有成员。基类中的保护成员在派生类中变成了私有成员。基类中的私有成员或不可访问成员在派生类中依然是不可访问的。protected

保护继承基类中的公有成员在派生类中变成了保护成员。基类中的保护成员在派生类中变成了保护成员。基类中的私有成员或不可访问成员在派生类中依然是不可访问的。类的默认访问权限是什么?为什么使用它作为默认权限?如果没有显式指定类的访问权限.程序将使用默认的权限private,以保证类的安全性,使得其他类不能访问该类的数据和方法,体现了良好的封装性。不显式标明继承方式的前提下,默认的继承方式是私有继承。为什么要使用PROTECTED关键字?如何使用?不同访问属性成员经过3种不同派生后访问属性的变化派生方式基类的public成员基类的private成员基类的protected成员派生方式引起的访问属性的变化private派生变成

私有成员不可见变成

私有成员基类中的公有和保护成员在派生类中变成了私有成员protected派生变成

保护成员不可见变成

私有成员基类中的公有成员和保护成员的访问属性都降一级public派生还是

公有成员不可见变成

保护成员基类中的公有成员和保护成员在派生类中的访问属性不变为什么派生类不能访问其基类的PRIVATE成员?不允许派生类访问基类的私有成员主要是为了保证程序的安全性。派生类不能实现对基类中私有成员的直接操作,但是通过基类提供的公有的函数,可以在派生类中间接访问这些私有成员。class

Base{public:void

add(int

a){cout<<"a="<<a;}//基类中提供一个公有成员函数用于操作私有成员数据aprivate:int

a;//基类中定义一个私有成员数据a};class

Derived:public

Base{public:void

test(){add(2);}//通过基类的公有成员函数实现对私有成员数据a的访问};STRUCT与CLASS之间有什么不同?从定义来看,struct和class没有任何区别。访问权限和继承方式有区别。如果没有显式指定访问级别,class中默认的成员访问权限是private,而struct中默认的成员访问权限是public。涉及继承关系时,如果没有显式指定派生类与父类的继承方式,class的继承方式默认是private,而struct的继承方式默认是public。struct

A//用struct定义类{public:const

char*

GetName()const;private:char*

m_name;int

m_weight;int

m_height;};class

B//用class定义类{public:const

char*

GetName()const;private:char*

m_name;int

m_weight;int

m_height;};如何为基类构造函数传递参数?在C++中可以通过扩充派生类的构造函数,来实现向基类构造函数传递参数的操作,实现方式如下:派生类构造函数名(参数列表):基类1构造函数名(参数列表),基类2构造函数名称(参数列表),…基类N构造函数名称(参数列表)#include

<iostream.h>class

Base{protected:int

i;public:Base(int

x){i=x;cout<<"i="<<i<<"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论