当前位置:文档之家› 多态

多态

多态
多态

多态:

1、静态多态(编译时的多态)

2、动态多态(运行时的多态)

静态联编支持的多态性称为编译时多态,也称为静态多态。C++中,编译时多态是通过函数重载和运算符重载实现的。

动态联编所支持的多态性称为运行时多态性,也称为动态多态性。在C++中,运行时多态性是通过继承和虚函数来实现的.

本章讲的内容就是动态多态性。

1.对象指针以及虚函数的引入

基类的指针可以指向派生类对象

#include

using namespace std;

class Base

{

int m_a;

public:

Base(int a):m_a(a){}

void show()

{

cout<<"Base()"<<" ";

cout<

}

};

class Derived:public Base

{

int m_a;

public:

Derived(int a,int b):Base(a),m_a(b){}

void show()

{

cout<<"Derived()"<<" ";

cout<

}

};

int main()

{

Base b(1),*p;

Derived d(2,3);

p = &b; //基类指针指向基类对象

p->show(); //基类指针调用成员获取的是基类部分的成员

p = &d; //基类指针指向派生类对象

p->show(); //基类指针调用成员获取的还是基类部分的成员

/*强转指针类型为派生类,调用成员获取的派生类里面的成员,派生类里面有2个show,派生类的show隐藏了基类的show*/ ((Derived*) p)->show();

/*强转指针类型为派生类,调用成员获取的派生类里面的成员,派生类里面有2个show,派生类的show隐藏了基类的show,

想要获取基类的成员需要用作用域*/

((Derived*) p)->Base::show();

return0;

}

补充说明:

1.声明为指向基类的指针可以指向它的公有派生类的对象,但不允许指向它的非公有派生类对象,原因:非公有派生,在派生类里面的从基类继承而来的公有成员属性变为不是公有,不能被外部访问(当然强转类型可以,但是没意义),如下:

#include

using namespace std;

class Base

{

public:

Base(){}

void show(){cout<<"Base show"<

};

class Derived:private Base//私有派生

{

public:

Derived(){}

void show(){cout<<"Derived show"<

};

int main()

{

Base b,*p;

Derived d;

// p = &d; //error,基类指针不允许指向非公有派生的派生类对象p = (Base*)&d; //通过强转指针类型,虽然骗过编译器,但这样做没意义p->show(); //破坏了继承机制

return0;

}

2.允许基类的指针指向公有派生类对象,但是不能将一个派生类对象的指针指向基类。

原因:基类指针类型小于派生类,所以基类指针指向派生类对象,调用时不会越界

而相反,派生类指针类型大于基类,所以派生类指针指向基类对象,调用可能越界

强转虽然能骗过编译器,但是存在越界问题,下面2个代码来分析上述问题。

下面这个代码,不能检测出越界问题

#include

using namespace std;

class Base

{};

class Derived:public Base//公有派生

{

public:

void f(){cout<<"hello"<

};

int main()

{

Base b;

Derived d,*p;

// p = &b; //error, 不允许派生类对象指向基类对象

p = (Derived *)&b; //通过强转,骗过编译器的检查,但存在越界问题

/*运行后,显示正常。注,这样不会出现越界问题.

原因:一个类所有的函数都是在code代码区中唯一的存放一份。*/

p->f();

return0;

}

下面这个代码才能检测出派生类对象指针指向基类对象产生的越界问题:

#include

using namespace std;

class Base

{};

class Derived:public Base//公有派生

{

public:

Derived():m_a(1){}

void f(){cout<

private:

int m_a;

};

int main()

{

Base b;

Derived d,*p;

// p = &b; //error, 不允许派生类对象指向基类对象

p = (Derived *)&b; //通过强转,骗过编译器的检查,但存在越界问题

/*运行后,打印的是一个随机数。注,出现越界问题.

原因:数据成员是每个对象存储一份,并按照声明顺序依次存放。*/

p->f(); //这里打印随机数的原因,基类中没有数据成员m_a,打印了一个越界的值.

return0;

}

3.基类指针指向派生类对象时,只能用它来直接访问派生类从基类继承来的公有成员,而不能直接访问公有派生类中定义的成员(间接访问,用到下面要将的虚函数知识)。调用前强转指针类型例外,如下代码:

#include

using namespace std;

class Base

{

public:

void fb(){cout<<"Base"<

};

class Derived:public Base//公有派生

{

public:

void fd(){cout<<"Derived"<

};

int main()

{

Base b,*p;

Derived d;

p = &d; //基类指针指向派生类对象

p->fb(); //ok

/*下面代码 error,基类指针指向派生类对象时,不能直接访问公有派生类中定义的成员

p->fd(); */

((Derived*)p)->fd(); //通过强转类型为派生类指针,可访问派生类公有成员

return0;

}

2.虚函数的定义及使用

C++的虚函数实现的多态性能解决基类指针不能操作派生类的数据成员的问题

虚函数是重载的另一种表现形式。这是一种动态的重载方式,它提供了一种更为灵活的多态性机制。虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,即所谓的动态联编。

在本章的第一个代码中,使用对象指针的目的是为了表达一种动态的性质,即当基类指针指向不同的对象时执行不同的操作,但是没能实现。其实只要将函数show()声明为虚函数,就能实现这种动态调用的功能。虚函数的关键字virtual . 如下代码:

#include

using namespace std;

class Base

{

int m_a;

public:

Base(int a):m_a(a){}

virtual void show() //定义为虚函数

{

cout<<"Base()"<<" ";

cout<

}

};

class Derived:public Base

{

int m_a;

public:

Derived(int a,int b):Base(a),m_a(b){}

virtual void show() //子类重新定义虚函数

{

cout<<"Derived()"<<" ";

cout<

}

};

int ma in()

{

B ase b(1),*p;

Derived d(2,3);

p = &b; //基类指针指向基类对象

p->show(); //由于show 函数是虚函数,基类指针指向那个对象,就去调用哪个对象的show函数

p = &d; //基类指针指向派生类对象

p->show(); //由于show 函数是虚函数,基类指针指向那个对象,就去调用哪个对象的show函数

return0;

}

有上述描述可见,虚函数同派生类结合可以使C++支持运行时的多态,而多态性对是面向对象的程序设计是非常重要的,实现了在基类定义派生类所拥有的通用接口,而在派生类定义具体实现的方法,即常说的“同一接口,多种方法”,它帮助程序员处理越来越复杂的程序。

虚函数的补充说明:

1.在派生类对基类中的虚函数进行重新定义时,关键字virtual 可以写也可以不写。如果不写virtual,而程序员又仅仅只看了下派生类,可能会误认为函数不是虚函数,所以最好写。

2.虚函数被重新定义时,其函数的原型与基类中的函数原型必须完全相同。

3.定义了虚函数后,在main()中创建的指向基类的指针运行去指向派生类对象。在执行过程中,不断改变基类指针指向的对象,就能调用不同的版本,而且这些动作都是在运行时动态实现的。可见用虚函数充分体现可面向对象程序设计的动态多态性。

4.虽然通过. :: 等运算符我们也可以去调用虚函数,但是这样采用的是静态联编,它没有充分利用虚函数的特性。只有通过基类指针访问虚函数时才能获得运行时的多态性。

5.一个虚函数无论被公有继承多少次,它仍然保持虚函数特性。

6.虚函数必须是类的成员函数,而不能是一个友元函数,也不能是静态成员函数,因为虚函数要靠特定的对象来决定调用的函数。虚函数可以被声明为另一个类的友元

7.构造函数不能是虚函数,但析构函数可以是虚函数。

虚函数与重载函数的关系

在一个派生类中重新定义基类的虚函数是函数重载的另一种形式,但它不同于一般的函数重载。当普通函数重载时,其函数的参数个数或参数的类型必须有所不同,返回类型无所谓。但是,当重载一个虚函数时,也就是说在派生类中重新定义虚函数时,要求函数名,返回类型、参数个数、参数类型和顺序与基类中的虚函数原型完全相同。

在派生类中重载基类的虚函数时,如果仅仅返回类型不同,其余均相同,系统报错;若仅仅函数名相同,而参数个数或类型不同或顺序不同,系统将它作为普通函数的重载,这时虚函数的特性将丢失。

#include

using namespace std;

class Base

{

public:

virtual void show1() //定义为虚函数

{

cout<<"Base"<

}

virtual void show2() //定义为虚函数

{

cout<<"Base"<

}

virtual void show3(){}

};

class A:public Base

{

public:

void show1() //子类重新定义虚函数

{

cout<<"A"<

}

void show2(int a) /*派生类重新定义虚函数,参数不同,破坏虚函数特性,变为普通的函数重载*/

{

cout<<"A"<

}

/* 下面函数,编译报错。

原因:在派生类重新定义基类的虚函数如果只有函数返回类型不同,则编译报错

int show3(){} */

};

class B:public A

{

public:

void show1() //子类重新定义虚函数

{

cout<<"B"<

}

void show2(int a) //由于在上面A类里面,虚函数特性已经破坏,这里不是虚函数

{

cout<<"B"<

}

};

int main()

{

Base base,*p;

A a;

B b;

p = &base;

p->show1();

p->show2();

p = &a;

p->show1();

p->show2();/*类A里面的show2函数不是虚函数,所以获取的不是类A的show2函数而是基类的*/

p = &b;

p->show1();

p->show2();/*在类A里面已经破坏了show2的虚函数特性,这里不是虚函数*/

return0;

}

3.多重继承与虚函数

多重继承可以视为多个单继承的组合。因此,多重继承情况下的虚函数调用与单继承情况下的虚函数调用有相似之处。如下:

#include

using namespace std;

class Base1

{

public:

virtual void show() //定义为虚函数

{

cout<<"Base1"<

}

};

class Base2

{

public:

void show() //定义为非虚函数

{

cout<<"Base2"<

}

};

class Derived:public Base1,public Base2

{

public:

void show()

{

cout<<"Derived"<

}

};

int main()

{

Base1 b1;

Base2 b2;

Derived d;

Base1 *p1;

p1 = &b1;

p1->show(); //此处的show是虚函数

p1 = &d;

p1->show(); //此处的show是虚函数

//----------------

Base2 *p2;

p2 = &b2;

p2->show(); // 此处的show不是虚函数

p2 = &d;

p2->show(); // 此处的show不是虚函数

return0;

}

虚函数举例:

例,用C++动态的多态性,计算三角形、矩形和圆的面积

#include

using namespace std;

class figure//figure 单词是图形的意思

{

public:

virtual void show_area()

{

cout<<"这是一个模糊的图像"<

}

};

class triangle:public figure

{

double m_width,m_high;

public:

triangle(double a ,double b):m_width(a),m_high(b){} virtual void show_area()

{

cout<<"三角形的面积为:"<

}

};

class square:public figure

{

double m_width,m_high;

public:

square(double a ,double b):m_width(a),m_high(b){} virtual void show_area()

{

cout<<"矩形的面积为:"<

}

};

class circle:public figure

{

double m_r;

public:

circle(double r):m_r(r){}

virtual void show_area()

{

cout<<"圆形的面积为:"<

}

};

int main()

{

triangle t(2,4);

square s(5,6);

circle c(4);

figure *p;

p = &t;

p->show_area();

p = &s;

p->show_area();

p = &c;

p->show_area();

return0;

}

4.纯虚函数和抽象类

有时,基类往往表示一种抽象的概念,它并不与具体的事物相联系。如上面代码里面的figure 类,它是一个抽象的、用来表示图形的类。从figure可以派生出三角形、矩形、圆三个具体的图形类,在figure中去求图形的面积是毫无意义的。但是我们可以将figure类里面的成员函数说明为虚函数,为它的派生类提供一个公共的接口,各个派生类根据所要表示的图形的不同来重新定义这些虚函数,用来提供求面积的各自版本。为此、C++增加了纯虚函数的概念。

纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但要求在它的派生类中定义自己的版本,或重新说明为纯虚函数。

纯虚函数的一般形式:

virtual 返回类型函数名(参数表) = 0;

那么上面的代码中figure 类中的虚函数就可以定义纯虚函数,如下:

class figure//figure 单词是图形的意思

{

public:

virtual void show_area() = 0 ; //定义纯虚函数

};

如果一个类至少有一个纯虚函数,那么就称该类为抽象类。

对于抽象类,有一下几点规定:

1.由于抽象类至少含有一个纯虚函数,因此抽象类只能作其它类的基类。不能建立抽象类的对象。

2.抽象类不能作参数的类型、函数返回类型或显示转换的类型。但可以定义指向抽象类的指针或引用,此指针可以指向它的派生类,进而实现多态性。

3.如果抽象类的派生类中没有重新定义纯虚函数,那么这个派生类仍然是一个抽象类。

注:

前面我们一直提的是基类的指针去指向派生类对象,可以实现动态的多态,其实,我们用用引用也可以实现(引用内部的实现还是用到了指针),如下代码描述:

#include

using namespace std;

class Base

{

public:

virtual void show(){cout<<"Base show"<

};

class Derived:public Base

{

public:

virtual void show(){cout<<"Derived show"<

int main()

{

Base b;

Derived d;

Base *p;

p = &b;

p->show();

p = &d;

p->show();

cout<<"-------------------"<

Base &y = b; // 创建指向基类的基类类型引用

y.show();

Base &y1 = d; //创建指向派生类的基类类型引用

y1.show();

return0;

}

虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象。

如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。因为它会为类增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移植性。

所以,无故的声明虚析构函数和永远不去声明一样是错误的。实际上,很多人这样总结:当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数。

#include

using namespace std;

class Base

{

public:

virtual ~Base()

{

cout<<"~Base"<

}

};

class Derived:public Base

{

public:

~Derived()

{

cout<<"~Derived"<

}

};

int main()

{

Base * p = new Derived;

delete p;

return0;

}

执行结果:

~Derived

~Base

上面代码可以正确释放,但是一旦将基类的析构函数的virtual 去掉那么就会产生释放部分空间的问题.

将上面代码基类的析构函数的virtual 去掉后的输出结果:

~Base

补充:

析构函数可以是纯虚的,但是纯虚析构函数必须提供定义,且要在类外定义.

这个定义是必需的,因为虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。这就是说,即使是抽象类,编译器也要调用析构函数,所以要保证为它提供函数体。如果不这么做,有些编译器报错,有些编译器不报错但运行出错。

#include

using namespace std;

class Base

{

public:

virtual ~Base() = 0;

};

Base::~Base() //基类纯虚析构函数在类外定义,如果不定义,编译会报错{

cout<<"~Base"<

}

class Derived:public Base

{

public:

~Derived()

{

cout<<"~Derived"<

}

};

int main()

{

Base * p = new Derived;

delete p;

return0;

}

两个连接体的一图多态老师版

共交力系及一图多态小专 例题1:如图所示,用完全相同的轻质弹簧1、2、3将两个相同的小球连接并懋挂,小球静止时,弹簧3水平,弹簧1与竖直方向的夹角θ=30°,弹簧1的弹力大小为F ,则( B ) A. 弹簧3的弹力大小为2F B. 弹簧3的弹力大小为2 F C. 每个小球重力大小为23F D. 每个小球重力大小为3F 解决方法1:整体隔离法 解决方法二:一图多态

例题2: 如图所示,两质点A 、B 质量分别为m 、2m ,用两根等长的细轻绳悬挂在O 点,两球之间夹着一根劲度系数为k 的轻弹簧,静止不动时,两根细线之间的夹角为60°。设绳OA 、OB 与竖直方向的夹角分别为α和β,则( B ) A. βα2= B. βαsin 2sin = C. βαtan 2tan = D. βα2cos cos = 方法一:共交力系法(力矩平衡): 方法二:一图多态

例题3:(一图多态、共点力)如图所示,两个可视为质点的小球a 和b ,用一不计重力的刚性轻细杆相连,再用两根等长的轻细绳吊在O 点。已知小球a 和b 的质量之比a m :b m =1:3,细杆长度是细绳长度的2倍。两球处于平衡状态时,细杆与水平面的夹角为θ,绳Oa 上的拉力为a F ,绳Ob 上的拉力为b F ,则下列说法正确的是( B ) A. ?=30θ B.?=15θ C.1:3:=b a F F D.2:2:=b a F F 解题法:

练习1:(一图多态、共点力)如图所示,一轻质细杆两端分别固定着质量为mA 和mB 的两个小球A 和B(可视为质点),将其放在一个直角形光滑槽中,已知轻杆与槽右壁成α角,槽右壁与水平地面成θ角时,两球刚好能平衡,且α≠0,则A. B 两小球质量之比为( C ) A. sin θsin αcos θcos α?? B. cos θ sin αsin θcos α?? C.cos θcos αsin θsin α?? D. cos θcos αcos θsin α?? 练习2:(一图多态、共点力)如图所示,一个半球形的碗放在桌面上,碗口水平,O 是球心,碗的内表面光滑。一根轻质杆的两端固定有两个小球,质量分别是m1,m2.当它们静止时,m 1、m 2与球心的连线跟水平面分别成60°,30°角,则碗对两小球 的弹力大小之比是( B ) A. 1:2 B. 1:3 C. 3:1 D. 2:3 练习3:如图所示,在墙角有一根质量为m 的均匀绳,一端悬于天花板上的A 点,另一端悬于竖直墙壁上的B 点,平衡后最低点为C 点,测得AC =2BC ,且绳在B 端附近的切线与墙壁夹角为α,已知重力加速度为g ,则绳在A 处的张力是________,在最低点C 处的张力是________。 答案:α2tan 43mg += A T αmgtan 3 1=C T

药物代谢酶基因多态性简介

药物代谢酶基因多态性简介 代谢酶基因多态性是指由于编码代谢酶的DNA序列的单核苷酸多态性等可遗传变异,导致的不同种群之间代谢酶的底物特异性无变化,但是代谢酶的活性存在显著的差别的现象。由此可能造成个体间PK和药物反应的差异,进而造成不必要的治疗失败和毒副作用。单核苷酸多态性(SNPs)存在于Ⅰ相代谢酶、Ⅱ代谢酶和转运体等多个方面,其中临床影响较大的为CYP450酶的基因多态性,因此了解不同人群代谢酶活性的差异有助于理解种群间PK差异和实现个性化治疗。SNPs存在于许多亚型的代谢酶中,Sarah等人的研究结果显示如下图,其中高加索人种中CYP2D6多态性的频率最高,其次为CYP2A6和2B6。但是并非所有的CYPs均参与药物代谢,既存在较高频率的多态性,又与药物代谢相关的为CYP1A2, 2D6, 2C9和2C19,其中CYP2D6与多数药物的代谢相关,下文将以CYP2D6为代表阐述其进化特征、功能多样性和临床影响等相关内容。 CYP2D6是由497个氨基酸组成的多肽,其对生物碱类物质具有较高的亲和力,该酶不可被环境因素调控且不能被诱导。最早CYP2D6的多态性是由

于个体间PK差异引起人们注意的,而后随着生物技术手段的提升才逐渐揭开其遗传基础。CYP2D6位于染色体22q13.1上,其邻近包含两个假基因CYP2D7和CYP2D8。至今发现了几十种CYP2D6的等位基因,大多数编码有缺陷的基因产物,最常见的突变型等位基因分布于不同种群中,如CYP2D6*2, CYP2D6*4, CYP2D6*5, CYP2D6*10和CYP2D6*17等,详细见下图,其可分为彻底失活、活性降低、正常、活性增加和活性本质上的改变五大类,在不同种群中分布特点有明显的差异。亚洲人群最常见的CYP2D6*10,其发生了P34S的有害突变导致了P450折叠功能的丧失而造成不稳定性,且降低了底物的亲和力。非洲人群中常见突变体为CYP2D6*17发生的错义突变导致其活性位点结构发生改变,由此造成底物特异性发生改变,且其活性低于野生型。 如下图演示了CYP2D的演变规律,啮齿动物与人的活性CYP2D基因的数量存在巨大的差异,小鼠有9个不同的活性基因,而人只有1个,且7%的高加索人群缺失该活性基因。由于CYP2D6对于生物碱类的生物毒素具有高亲和力,进化角度可以认为小鼠需要保留较多的活性基因来维持解毒能力,而人类的饮食结构更为严谨进而逐渐不需要更多的活性基因。 不同人群中的CYP2D6的代谢活性可分为超快代谢(ultrarapid metabolizers, UMs)、快代谢(extensive metabolizers, EMs)、中等代谢(intermediate metabolizers, IMs)和慢代谢(poormetabolizers, PMs)四种类型。一般而言,白人种PMs的频率较高约为10%左右,而亚洲人群中

多态性实现机制

C++的多态性实现机制剖析 ――即VC++视频第三课this指针详细说明 作者:孙鑫时间:2006年1月12日星期四 1.多态性和虚函数 我们先看一个例子: 例1- 1 #include class animal { public: void sleep() { cout<<"animal sleep"<breathe(); } 注意,在例1-1的程序中没有定义虚函数。考虑一下例1-1的程序执行的结果是什么? 答案是输出:animal breathe 我们在main()函数中首先定义了一个fish类的对象fh,接着定义了一个指向animal类的指针变量pAn,将fh的地址赋给了指针变量pAn,然后利用该变量调用pAn->breathe()。许多学员往往将这种情况和C++的多态性搞混淆,认为fh实际上是fish类的对象,应该是调用fish类的breathe(),输出“fish bubble”,然后结果却不是这样。下面我们从两个方面来讲述原因。

1、 编译的角度 C++编译器在编译的时候,要确定每个对象调用的函数的地址,这称为早期绑定(early binding ),当我们将fish 类的对象fh 的地址赋给pAn 时,C++编译器进行了类型转换,此时C++编译器认为变量pAn 保存的就是animal 对象的地址。当在main()函数中执行pAn->breathe()时,调用的当然就是animal 对象的breathe 函数。 2、 内存模型的角度 我们给出了fish 对象内存模型,如下图所示: 图1- 1 fish 类对象的内存模型 我们构造fish 类的对象时,首先要调用animal 类的构造函数去构造animal 类的对象,然后才调用fish 类的构造函数完成自身部分的构造,从而拼接出一个完整的fish 对象。当我们将fish 类的对象转换为animal 类型时,该对象就被认为是原对象整个内存模型的上半部分,也就是图1-1中的“animal 的对象所占内存”。那么当我们利用类型转换后的对象指针去调用它的方法时,当然也就是调用它所在的内存中的方法。因此,输出animal breathe ,也就顺理成章了。 正如很多学员所想,在例1-1的程序中,我们知道pAn 实际指向的是fish 类的对象,我们希望输出的结果是鱼的呼吸方法,即调用fish 类的breathe 方法。这个时候,就该轮到虚函数登场了。 前面输出的结果是因为编译器在编译的时候,就已经确定了对象调用的函数的地址,要解决这个问题就要使用迟绑定(late binding )技术。当编译器使用迟绑定时,就会在运行时再去确定对象的类型以及正确的调用函数。而要让编译器采用迟绑定,就要在基类中声明函数时使用virtual 关键字(注意,这是必须的,很多学员就是因为没有使用虚函数而写出很多错误的例子),这样的函数我们称为虚函数。一旦某个函数在基类中声明为virtual ,那么在所有的派生类中该函数都是virtual ,而不需要再显式地声明为virtual 。 下面修改例1-1的代码,将animal 类中的breathe()函数声明为virtual ,如下: 例1- 2 #include fish 类的对象所占内存

第七章继承多态练习题

第七章继承多态 一、选择题: 1、分析: class A { A() { } } class B extends A { //系统自动生成的构造方法和类的访问权限一样 } 哪两种说法是正确的? ( ) A:类B的构造方法是public的. B:类B的构造方法包含对this()的调用. C:类B的构造方法没有参数. D:类B的构造方法包含对super()的调用. 2、运行结果是:() class Base { Base() { System.out.print("Base"); } } public class Alpha extends Base { public static void main( String[] args ) { new Alpha(); new Base(); } } A: Base B: BaseBase C: 编译失败. D: 没有输出. E: 运行时异常. 3. 程序的运行结果是?() A: 编译失败. B: hello from a C: hello from b D: hello from b E: hello from a hello from a hello from b

4. 运行结果是:() class TestSuper { TestSuper(int i) { } } class TestSub extends TestSuper{ } class TestAll { public static void main (String [] args) { new TestSub(); } } A: 编译失败. B: 程序运行没有异常. C: 第7行抛出异常. D: 第2行抛出异常. 5. 程序的运行结果是?() A: 0 B: 1 C: 2 D: 编译失败. 6. 对于语句"B is a D" 和"B has a C",一下哪两种说法是正确的? ( ) A:D是B. B:B是D. C:D是C. D:B是C. E:D继承B. F:B 继承D. 7. 运行结果是?()

C++对多态的理解

1. 什么是多态 多态是C++中的一个重要的基础,可以这样说,不掌握多态就是C++的门个汉。我就给它定一个这样的名字-- “调用’同名函数’却会因上下文不同会有不同的实现的一种机制”。这个名字长是长了点儿,可是比“多态”清楚多了。看这个长的定义,我们可以从中找出多态的三个重要的部分。一是“相同函数名”,二是“依据上下文”,三是“实现却不同”。我们且把它们叫做多态三要素吧。 2. 多态带来的好处 多态带来两个明显的好处:一是不用记大量的函数名了,二是它会依据调用时的上下文来确定实现。确定实现的过程由C++本身完成,另外还有一个不明显但却很重要的好处是:带来了面向对象的编程。 3. C++中实现多态的方式 C++中共有三种实现多态的方式。由“容易说明白”到“不容易说明白”排序分别为: 第一种是函数重载;第二种是模板函数;第三种是虚函数。 4. 细说用函数重载实现的多态 函数重载是这样一种机制:允许有不同参数的函数有相同的名字。 具体一点讲就是:假如有如下三个函数: void test(int arg){} //函数1 void test(char arg){} //函数2 void test(int arg1,int arg2){} //函数3 如果在C中编译,将会得到一个名字冲突的错误而不能编译通过。在C++中这样做是合法的。可是当我们调用test的时候到底是会调用上面三个函数中的哪一个呢?这要依据你在调用时给的出的参数来决定。如下: test(5); //调用函数1 test('c');//调用函数2 test(4,5); //调用函数3 C++是如何做到这一点的呢?原来聪明的C++编译器在编译的时候悄悄的在我们的函数名上根据函数的参数的不同做了一些不同的记号。具体说如下: void test(int arg) //被标记为‘test有一个int型参数’void test(char arg) //被标记为‘test有一个char型的参数’void test(int arg1,int arg2) //被标记为‘test第一个参数是int型,第二个参数为int型’ 这样一来当我们进行对test的调用时,C++就可以根据调用时的参数来确定到底该用哪一个test函数了。噢,聪明的C++编译器。其实C++做标记做的比我上面所做的更聪明。我上面哪样的标记太长了。C++编译器用的标记要比我的短小的多。看看这个真正的C++的对这三个函数的标记: ?test@@YAXD@Z ?test@@YAXH@Z ?test@@YAXHH@Z 是不是短多了。但却不好看明白了。好在这是给计算机看的,人看不大明白是可以理解的。 还记得cout吧。我们用<<可以让它把任意类型的数据输出。比如可以象下面那样: cout << 1; //输出int型 cout << 8.9; //输出double型

基因多态性-高血压摘要

1、云南省优秀硕士学位论文推荐表

注:1. 表中一级学科及二级学科代码和名称均按国务院学位委员会、国家教育委员会一九九七年六月公布的《授予博士、硕士学位和培养研究生的学科、专业目录》的学科代码和名称填写。 2、作者出国进修情况 3、指导教师情况

4、硕士论文中英文摘要 中文摘要:β2-AR基因单核苷酸多态性与云南彝族和哈尼族原发性高血压相关性研究 目的原发性高血压(EH)是一种严重影响人类健康的常见慢性疾病,是心血管疾病的重要危险因素。流行病学研究表明,遗传与环境因素共同影响原发性高血压发病,其中遗传因素的影响占30%-50%,寻找原发性高血压易感基因成为原发性高血压遗传因素研究的焦点。血压水平由心输出量和外周阻力决定,受内源性交感神经系统紧密调节,而β2-肾上腺素受体(β2-AR)是主要分布在心脏上,在介导心脏交感神经-肾上腺系统信号转导中发挥着重要的作用,因此人类的β2-AR基因被认为是原发性高血压的候选基因。本工作的目的是研究云南彝族和哈尼族β2-AR基因的单核苷酸多态性(SNP)与原发性高血压的相关性。 方法为了减少遗传异质性和环境因素的影响,样品采集在云南农村的一个隔离人群中完成,原发性高血压病例组:样本来源于无血缘关系的云南彝族和哈尼族原发性高血压患者271例,高血压病的诊断按照1999年2月WHO/ISH规定的标准(在未服抗高血压药的情况下,收缩压>140mmHg和/或舒张压>90mmHg),排除各种继发因素等,全部患者从未服用过降压药物。正常对照组:同样来自无血缘关系的云南彝族和哈尼族人群267例。本研究应用PCR-RFLP方法对调控区4个SNPs,编码区6个SNPs和3’端1个SNP进行基因分型,根据最大似然法在调控区和编码区估计单倍型,用卡方检验进行相关性分析。 结果在整个样本中,各SNPs基因型分布符合Hardy-Weinberg平衡。彝族中,在调控区和编码区都存在单核苷酸位点在病例组和对照组之间存在显著性差异,而哈尼族中则没有一个位点在病例组和对照组之间存在显著性差异。通过单倍型分析,两个民族的单倍型分布在病例组和对照组都呈现显著差异。基因型分析和单倍型分析的结果一致。 结论我国云南彝族人群中β2-AR基因各位点多态性与高血压病相关,所以β2-AR各多态位点可以作为云南彝族原发性高血压遗传易感性检测的标志之一。 关键词:肾上腺素受体;单倍型;原发性高血压 英文摘要:Association of the β2-adrengic receptor gene with essential hypertension in Yi and Hani minority of Yunnan province Objective Essential hypertension (EH) is an important risk factor for cardiovascular disease. Epidemiology indicates that EH is a complicated hereditary disease involving both genetic and environmental factors. Between 30% and 50% of blood pressure variation in the population is determined by genetic factor. Researchers

分子生物学作业

分子生物学作业 一、名词解释 1.断裂基因 真核生物结构基因,由若干个编码区和非编码区相互间隔开但又连续镶嵌而成,去除非编码区再连接后,可翻译出由连续氨基酸组成的完整蛋白质,这些基因成为断裂基因。 2.单核苷酸多态性 单核苷酸多态性是由基因组DNA上的单个碱基的变异引起的DNA 序列多态性。是人群中个体差异最具代表性的DNA多态性,相当一部分还直接或间接与个体的表型差异、对疾病的易感性或抵抗能力、对药物的反应性等相关。单核苷酸多态性被认为是一种能稳定遗传的早期突变。 一、简答题 1.简述真核生物基因组的结构与功能特点。 ①真核生物基因组DNA与蛋白质结合形成染色体,储存于细胞核 内,除配子细胞外,体细胞内基因组是双份的(即双倍体),有两份同源的基因组。 ②真核生物的基因转录产物为单顺反子。即一个结构基因经过转 录生成一个mRNA分子,再翻译生成一条多肽链。 ③真核生物基因组存在重复序列,重复次数可达百万次以上。 ④真核生物基因组中不编码的区域多于编码的区域。 ⑤真核生物的大部分基因都含有内含子,因此,基因是不连续的

(断裂基因)。 ⑥真核生物基因组远远大于原核生物的基因组,具有多复制起始 点,而每个复制子的长度较小。 2.试述双向凝胶电泳技术的基本原理。 双向凝胶电泳技术是指第一向的固相pH梯度等电聚焦电泳与第二向SDS-PAGE组成的分离系统,也称双向聚丙烯酰胺凝胶电泳,简称2-DE。等电聚焦电泳是基于蛋白质等电点(pI)的差异进行分离,SDS-PAGE则是根据蛋白质分子量(Mw)的不同进行分离。 其中等电聚焦指:在电场中电泳基质形成一个从正极到负极不断增大的PH梯度,由于蛋白质为两性电解质,带负电荷的蛋白质分子向正极移动,待正电荷的蛋白质分子向负极移动,当蛋白质分子运动到各自的PI处时,所带净电荷变为零,于是停止迁移而留在该位置上,这种不同的蛋白质分别聚焦在各自的PI处,形成一条狭窄稳定的区带而彼此分开的现象就称为等电点聚焦。 SDS-PAGE是在PAGE系统中加入SDS和还原剂后所组成的电泳系统。SDS是一种阴离子去垢剂,疏水端能插入蛋白质分子内,破坏蛋白质分子内的氢键及疏水作用,改变蛋白质分子的三级和四级结构;还原剂则断裂蛋白质分子内的二硫键,使蛋白质分子去折叠,结构变得舒展。蛋白质分子与SDS充分结合后,形成带负电荷的蛋白质-SDS复合物,所带负电荷大大超过蛋白质分子原有的电荷量,消除了不同分子间原有电荷的差异。蛋白质-SDS复合物在聚丙烯酰胺凝胶电泳系统中的迁移率不再与电荷相关,而主

实验8_继承和多态

实验08:继承与多态 实验学时:6 实验类型:验证、设计 实验要求:必修 一、实验目的 1.理解继承的概念,了解面向对象设计中继承和多态的合理性; 2.掌握派生类的构造与析构; 3.掌握在对象中使用类层次和继承思想进行设计、实现和测试; 4.区别运行时的多态性的实现,理解重载与同名覆盖的差异; 5.理解虚函数与多态性; 6.实现运行时多态性的程序设计。 二、实验内容 1.Difine a class called PartFileledArrayWMax that is a derived class of the class PartFilledArray. The class PartFilledArrayWMax has one additional member variable named max_value that holds the maximum value stored in the array. Define a member accessor function named get_max that returns the maximum value stored in the array. Redefine the member function add_value and define two constructors, one of which has an int argument for the maximum number of entries in the array. Also define a copy constructor, an overloaded assignment operator, and a destructor. (A real class would have more member functions, but these will do for an exercise.) 2.某公司雇员(employee)包括经理(Manager)、技术人员(Technician)和销售员(Saleman)。开发部经理(developermanager)既是经理也是技术人员,销售部经理(salesmanager)既是经理也是销售员。 以employee类为虚基类,派生出manager、technician和saleman类,再进一步派生出developermanager和salesmanager类。 Employee类的属性包括姓名、职工号、工资级别、月薪(实发基本工资加业绩工资);操作包括月薪计算函数pay(),该函数要求输入请假天数,扣除应扣工

Java多态的综合例子

Java多态的综合例子: package Test; public interface USBInterface { void start(); void conn(); void stop(); } package Test; public class MovingDisk implements USBInterface { @Override public void start() { // TODO Auto- System.out.println("移动设备已经插入,开始使用"); } @Override public void conn() { // TODO Auto-generated method stub System.out.println("移动设备已经连接,正在使用"); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("移动设备已经退出"); } } package Test; public class Mouse implements USBInterface { public void start() { System.out.println("鼠标已插入,开始使用"); } @Override public void conn() { System.out.println("鼠标已经连接,正在使用中"); } @Override public void stop() {

System.out.println("鼠标拨出"); } } package Test; public class MainBorad { public void start() { System.out.println("主板加载成功"); } public void useUsb(USBInterface u) { u.conn(); u.start(); u.stop(); } } package Test; public class KeyBoard implements USBInterface { @Override public void start() { System.out.println("键盘已经插入,开始使用"); } @Override public void conn() { // TODO Auto-generated method stub System.out.println("键盘已经连接,正在使用"); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("键盘已经拨出"); } } package Test; public class Test { /** * @param args

动生作业习题

作业习题 <多细胞动物的胚胎发育> 1 动物的完全卵裂有哪2种主要形式简述其不同之处。 完全卵裂(等裂和不等裂)(辐射和螺旋两种形式):不等裂由于卵黄分布不均.不完全卵裂(盘裂和表裂)(鱼\鸟\两栖纲的盘裂和昆虫表面卵裂) 2 无脊椎动物的早期胚胎发育经历哪几个阶段简述这几个阶段的发育过程。 囊胚,原肠胚,中胚层,神经胚,胚层分化及器官形成 3 动物的中胚层是如何发生的 肠腔法和裂体腔法 4 何为假体腔何为真体腔 5 简述神经胚的形成过程。 6 试比较原口动物与后口动物的差别。 口、肛门、卵裂方式、体腔出现方式、中胚层形成方式、幼虫类型. 7 简述文昌鱼和两栖动物的胚胎发育过程。 文昌鱼经过受精卵.囊胚.原肠胚.神经胚和幼体发育为成体.受精卵为均黄卵,卵的分裂为全裂和等裂,以内陷的方式形成原肠.原肠胚出现后.出现中胚层,三胚层进一步分化形成不同的器官和系统.接着神经胚发育,神经管形成并分化成脑和脊

髓。,文昌鱼体节分化为生骨节\生肌节\生皮节; 两栖动物经过受精卵.囊胚.原肠胚.神经胚和器官建成。两栖动物为辐射性卵裂,体腔是中胚层侧板中间的空腔,神经胚发育时,神经管形成病分化成脑和脊髓。 <动物的类群及多样性> 1 原生动物的主要生物学特征有哪些在生物进化中的地位如何 原生质特化(细胞内分工);具备生物所有营养类型:植物性营养、动物性营养、腐生性营养;出现了基本的酶系;具最原始的外骨骼;应激性代表了后生动物的反射和本能的开始;最早出现无性生殖和有性生殖.;原生动物是自然界中最原始、最简单的动物类群。 2 如何区别纤毛虫纲、鞭毛纲、肉足纲3类原生动物 原生动物分为鞭毛虫纲(3营养方式,纵二裂),肉足纲(伪足,变形运动,异养),纤毛虫纲(横二裂和接合生殖) 3 解释变形虫伪足形成的过程和机制。 原生质中的溶胶质和凝胶质的转换和流动,使虫体形成伪足而运动。这种运动实质是肌动蛋白丝在肌球蛋白丝上的滑动形成的。 4 纤毛和鞭毛的结构是什么样的它们在原生动物的生活中起什么作用 基本结构都是微管,在它们的横断面上可以看到九束微管,每束由两根微管构成,中间有两根独立的微管。它们与戏报子中的基粒连接,基粒由每束三根微管组成。原生动物靠鞭毛和纤毛在水中有规律地摆动,借水的反作用力使虫体运动。

Java中的多态用法实例分析

Java中的多态用法实例分析 多态分两种: (1)编译时多态(设计时多态):方法重载。 (2)运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态) 运行时多态存在的三个必要条件: 一、要有继承(包括接口的实现); 二、要有重写; 三、父类引用指向子类对象。 详细解释: 运行时多态的解释:a.运行时多态是指程序中定义的引用变量所指向的具体类型和b.通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定. 1.程序序中定义的引用变量所指向的具体类型不确定(即一个引用变量倒底会指向哪个类的实例对象)。 例子: driver类中drive方法(Vehicle类vehicle){} oneDriver.drive(newcar()) oneDriver.drive(newbus())

其中vehicle变量无法确定具体使用哪个子类实例。 1.通过该引用变量发出的方法调用在编程时并不确定(该引用 变量发出的方法调用到底是哪个类中实现的方法)。 例子:厨师,园丁,理发师的Cut方法调用.persion.cut(). 多态的好处: 1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。 2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。 3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3所示。图中超类Shape规定了两个实现多态的接口方法,puteArea()以及puteVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。 4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。 5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

多态的量子

多态的量子、多态的世界 我们知道,量子是最基本的能量单位,可以说是能量的最小单位,所有的微观粒子包括分子、原子、电子、光子他们都是量子的一种表现形态。其实,我们的这个世界本身都是微观粒子组成的,准确地说,整个自然界本身都是由量子组成的,宏观世界也是量子的一种表现形态。 量子的多态表现为,量子的状态没有被观察时,它是多态的,一旦被观察,则只能存在一个能量的状态。我们回忆薛定谔猫理论:设想在一个封闭的匣子里,有一只活猫及一瓶毒药。当衰变发生时,药瓶被打破,猫将被毒死。按照常识,猫可能死了,也可能还活着。量子力学告诉我们,存在一个中间态,猫既不死也不活,直到进行观察看看发生了什么。量子力学告诉我们:除非进行观测,否则一切都不是确定的,可这使微观不确定原理变成了宏观不确定原理,客观规律不以人的意志为转移,猫既活又死违背了逻辑思维。我们分析薛定谔猫论的假设,匣子、毒药、猫——构成了一个统一体,这一状态猫命悬一线本身就是多态的,从某种意义上讲匣子、毒药已经是猫生存的一部分,只是他们之间是否相互作用,不相互作用,等于毒药不存在,猫存活;相互作用,猫死。在匣子的存在下,我们不观察,真的不知道是否相互作用,只能是生、死共存状态。 托马斯·杨的双缝实验,量子力学认为,观察时光子走单缝,不观察时走双缝。只取决于你测量这个物体的方式。从量子学角度看,如

果你不观察它,那么现实并不存在或是模糊的、多态的,尽管听上去非常怪异,但结果证实了量子理论的正确性。例如光子,如果你用平面镜、水等手段研究光子的性质,那么光子具有粒子性——折射、反射;如果你用类似于双缝实验的手段测量光子的性质,光子即表现为波动性。 叠加的多态量子,有人为的,更多的是自然的,观察、测量时,测量的手段、方法解除了量子的多态,即确认量子的存在状态——唯一性。叠加即量子的分身,就是量子处在不稳定的、随时可变的多重状态,测量时即确定量子多态的哪一种状态。量子纠缠其实就是量子或多态量子之间的相互作用,纠缠就是量子之间的相互吸引,既然是相互吸引,不论纠缠的量子距离多远,相互纠缠的量子其中的一个量子的运动状态被改变,另一个量子的运动状态也必然随着改变。犹如天文观察到的相互绕转的双星,假设双星中的一个由于某种原因,例如爆炸损失一部分,双星的另一个运动状态必然改变。理论推测,组成量子的“元”,半径极短约在10-24米或更小,质量极小,但是密度极大,量子纠缠是通过量子“元”形成的密度引力相互作用的,使相干量子纠缠。 其实,不仅微观世界是多态的,宏观世界也是多态的。例如一张桌子,我们不同的感觉器官感觉它,会出现不同的存在“状态”,用眼睛看我们能得到桌子的形状,并不能知道桌子的其他性质,例如硬度、味道等。我们把盲人摸象的现象应用到量子的多态现象是非常形象

分生作业

分生作业1 一、名词解释 1. 断裂基因: 基因是核酸分子中贮存遗传信息的遗传单位,一个基因不仅仅包括编码蛋白质或RNA 的核酸序列,还包括保证转录所必需的调控序列、位于编码区5 ' 端与 3 ' 端的非编码序列和内含子。真核生物的结构基因,由若干个编码区和非编码区互相间隔开但又连续镶嵌而成,去除非编码区再连接后,可翻译出由连续氨基酸组成的完整蛋白质,这些基因称为断裂基因(split gene)。 2. 单核苷酸多态性:主要是指在基因组水平上由单个核苷酸的变异所引起的DNA序列多态性。它是人类可遗传的变异中最常见的一种。占所有已知多态性的90%以上。SNP在人类基因组中广泛存在,平均每500~1000个碱基对中就有1个,估计其总数可达300万个甚至更多。 二、简答题 1. 简述真核生物基因组的结构与功能特点。 答:(1)真核生物细胞核基因组的结构和功能。 ①:真核生物基因组存在大量的重复序列 a) 单拷贝序列(低度重复序列) b) 中度重复序列 c) 高度重复序列 d) 重复序列的多态性:主要包括单核苷酸多态性和串联重复序列多态性 ②:真核基因组存在多基因家族和假基因 多基因家族:是指由某一祖先基因经过重复和变异所产生的一组基因。 假基因:是指与某些有功能基因结构相似,但不能表达有功能基因产物的某些基因。(2)真核生物细胞器基因组的结构和功能 真核生物有两类细胞器能携带遗传物质:线粒体和叶绿体 大多数细胞器基因组是环状DNA,某些低等真核生物(如草履虫、衣滴虫和几种酵母)的线粒体DNA是线状分子。线粒体基因组的大小差异比较大,从1万至数百万bp不等。高等动物线粒体基因组具有独特的特点:母系遗传;线粒体DNA损伤后不易修复,突变率高,

多态的实现

多态:对于多态的实现,有三个关键字new,virtual,override的使用,多态可以简单的理解为对不同的对象调用相同的方法,表现出不同的行为,这种特性是通过继承来实现的。 例1: public class Animal { public virtual void Eat() { Console.WriteLine("Animal eat"); } } public class Cat : Animal { public override void Eat() { Console.WriteLine("Cat eat"); } } public class Dog : Animal { public override void Eat() { Console.WriteLine("Dog eat"); } } class Tester { static void Main(string[] args) { Animal[] animals = new Animal[3]; animals[0] = new Animal(); animals[1] = new Cat(); animals[2] = new Dog(); for (int i = 0; i < 3; i++) { animals[i].Eat(); } } } 输出如下: Animal eat... Cat eat... Dog eat... 在上面的例子中,通过继承,使得Animal对象数组中的不同的对象,在调用Eat()方法时,表现出了不同的行为。 1. new的用法 例2: public class Animal {

实验4 类的继承和多态机制

实验4 类的继承和多态机制 一、实验目的 1、掌握类的继承机制; 2、掌握子类对父类构造方法的调用; 3、掌握方法覆盖和方法重载的区别。 二、实验内容 1、定义点类Point、圆类Circle、圆柱体类Cylinder。实现继承关系。 2、定义交通工具类Vehicle,一个小车类Car。实现Car对Vehicle的继承。 三、实验步骤 1、定义点类Point、圆类Circle、圆柱体类Cylinder。实现继承关系。 设计一个表示二维平面上点的类Point,包括表示坐标位置的成员变量x和y,获取和设置x和y值的方法。 设计一个表示二维平面上圆的类Circle,它继承自类Point,还包括表示圆半径的成员变量r、获取和设置r值的方法、计算圆面积的方法。 设计一个表示圆柱体的类Cylinder,它继承自类Circle,还包括表示圆柱体高的成员h、获取和设置h的方法、计算圆柱体表面积的方法、计算圆柱体体积的方法。 建立若干个Cylinder对象,输出其轴心位置坐标、半径、高、表面积及其体积的值。 class Point{ int x; int y; ;public Point(int x,int y){ this.x =x; this.y=y; } public int getX(){ return x; } public int getY(){ return y; } } class Circle extends Point{ double r; final double PI=3.1416; public Circle(int x,int y,double m){ super(x,y); r=m; } public double getR(){ return r; } public double circlearea(){ return PI*r*r;

作业13

HZAU-专业C++作业13(运算符重载) 判断题 1. 所有的运算符都可以重载。F 2.在C++中,编译时的多态性是通过函数和运算符的重载实现的。T 3. 运算符重载是通过对已有的运算符重新定义操作功能来实现的,它是C++语言多态性 的一种表现。T 4. 运算符重载只可以是类的成员函数和友元函数,不可以是普通函数。T 5. 运算符重载是通过函数来实现的,定义运算符重载函数时,函数名中要使用关键字 operator。T 6. 运算符重载后,优先级、结合性和操作数都是不变的。T 7. 重载运算符的函数也可以设置默认参数。F 8. 使用成员函数方法和使用友元函数的方法所定义的重载运算符函数的参数个数是不 相同的。T 9. 运算符“.”、“::” 、“?:” 不能重载T 10. 运算符=、()、[]和->可作为类成员运算符, 不能作为友员运算符。T 选择题 1. 下列运算符中,(A )运算符在C++中不能重载。 A. ?: B. [ ] C. new D. && 2. 下列运算符不能用友元函数重载的是(c)。 A. + B. = C. * D. << 3. 在一个类中可以对一个操作符进行( D )重载。 A. 1种 B. 2种及以下 C. 3种及以下 D. 多种 4. 友元运算符obj1>obj2被C++编译器解释为( A )。 A. operator > (obj1, obj2) B. > (obj1, obj2) C. obj2.operator > (obj1) D. obj1.operator > (obj2) 5. 下列关于C++运算符函数的返回类型的描述中,错误的是( C )。 A. 可以是类类型 B. 可以是int类型 C. 可以是void类型 D. 可以是float类型

实验名称 java类的继承和多态

实验名称 java类的继承和多态实验名称 Java类的继承和多态 一、实验目的 1、理解Java类的继承和多态的概念 2、掌握类的继承机制的实现 3、掌握方法的重载,以及多态的实现。 二、实验要求 1、本实验属于验证型和设计型实验。需要根据已给的源程序运行结果,并结合问题进行新的设计; 2、对实验过程中提出的问题进行解答; 3、完成实验报告。 三、实验内容与过程 1、上机运行下面的程序,并回答下面的问题。 public class ClassOne{ int num=100; public void compute(){ num-=50; } public static void main(String args[]){ ClassOne one=new ClassOne(); ClassTwo two=new ClassTwo(); System.out.println(“num of ClassTwo:”+two.num); System.out.println(“num of ClassOne:”+two.getNum());

https://www.doczj.com/doc/d313944914.html,pute(); System.out.println(“num of ClassTwo:”+two.num); System.out.println(“num of ClassOne:”+two.getNum()); } } class ClassTwo extends ClassOne{ int num=0; public void plus(){ num+=50; } public int getNum(){ return super.num; } } 问题: (1) 请指出Java面向对象编程中三个主要特性。 (2) Java中的继承机制是什么, (3) 请指出程序中关键字super的作用。 2、运行下面的程序,回答问题。class Monkey{ private int age=10; void speak(){ System.out.println("I am monkey."); } }

相关主题
文本预览
相关文档 最新文档