c语言纯虚函数 c 纯虚函数

我想问各位大侠解释一下C语言中的抽象类型!

你说的是c++的抽象类

我们提供的服务有:网站设计制作、做网站、微信公众号开发、网站优化、网站认证、云州ssl等。为上1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的云州网站制作公司

纯虚函数和抽象类

纯虚函数是一种特殊的虚函数,它的一般格式如下:

class 类名

{

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

};

在许多情况下,在基类中不能对虚函数给出有意义有实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。下面给出一个纯虚函数的例子。

#include

class point

{

public:

point(int i=0, int j=0) { x0=i; y0=j; }

virtual void set() = 0;

virtual void draw() = 0;

protected:

int x0, y0;

};

class line : public point

{

public:

line(int i=0, int j=0, int m=0, int n=0):point(i, j)

{

x1=m; y1=n;

}

void set() { cout"line::set() called.\n"; }

void draw() { cout"line::draw() called.\n"; }

protected:

int x1, y1;

};

class ellipse : public point

{

public:

ellipse(int i=0, int j=0, int p=0, int q=0):point(i, j)

{

x2=p; y2=q;

}

void set() { cout"ellipse::set() called.\n"; }

void draw() { cout"ellipse::draw() called.\n"; }

protected:

int x2, y2;

};

void drawobj(point *p)

{

p-draw();

}

void setobj(point *p)

{

p-set();

}

void main()

{

line *lineobj = new line;

ellipse *elliobj = new ellipse;

drawobj(lineobj);

drawobj(elliobj);

cout setobj(lineobj);

setobj(elliobj);

cout"\nRedraw the object...\n";

drawobj(lineobj);

drawobj(elliobj);

}

抽象类

带有纯虚函数的类称为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。

抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。

抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类。

抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了。

C语言主要有哪些方面的东西要学!~

首先一定从最简单程序Hello World开始

然后是数据类型、标识符、运算符、表达式、常量和变量(这些都是最基础的了)

接着会讲一些算法流程

接下来就是系统的学习C编程,需要涉及的内容有:

完整的输入输出

顺序结构、分支结构、循环结构(包括中断和继续)

函数的定义和使用

数组及顺序表

指针与地址

结构体与共用体

数据结构(包括链表、栈与队列、树、图等)

学完这些之后就可以学C++了,C++主要涉及的内容如下:

引用和内联函数的使用

类与对象(及访问权限)

构造函数与析构函数

继承和多态

纯虚函数与抽象类

运算符重载

静态成员和友元

C++高级编程主要包括

STL模板(集合类)

UC高级编程和QT编程(Linux/Unix方向)

Windows内核编程和MFC(Windows方向)

访问数据库(数据库软件一般使用甲骨文,也有用SQL Server的)

C语言编程,求三角形园矩形的周长和面积,可抽象一个公共基base,在其中定义俩个纯虚函数用于求面积和周长

#include "stdio.h"

main()

{

float a,b,c,p;

loop1:

printf("please enter pianshang a:\n");

scanf("%f",a);

printf("please enter pianshang b:\n");

scanf("%f",b);

printf("please enter pianshang c:\n");

scanf("%f",c);

if(a+b=c||a+c=b||b+c=a)

{

printf("error! please check again and enter three number:");

goto loop1;

}

p=a+b+c;

printf("%f",p);

getch();

}

其实只能是一个函数,不能两个兼顾.

在C++中,什么是运算符重载?什么是虚函数?

多态性是指用一个名字定义不同的函数,这函数执行不同但又类似的操作,从而实现“一个接口,多种方法”。

多态性的实现与静态联编、动态联编有关。静态联编支持的多态性称为编译时的多态性,也称静态多态性,它是通过函数重载和运算符重载实现的。动态联编支持的多态性称为运行时的多态性,也称动态多态性,它是通过继承和虚函数实现的。

2.函数重载

函数重载的意义在于他能用同一个名字访问一组相关的函数。

在类中普通成员函数和构造函数都可以重载,特别是构造函数的重载(他提供了多种初使化方式)给用户更大的灵活性。在基类和派生类的函数重载有两种情况:一种是参数有所差别的重载。另一种是参数没有差别的重载,只是他们属于不同的类。

可以用以下两种方法来区分这两种函数:用对象名加以区分;使用“类名::”加以区分。

3.运算符重载称动态多态性,他是通过继承和虚函数实现的。

运算符重载通过创建运算符函数operator@()来实现。运算符函数定义了重载的运算符将要进行的操作,这种操作通常作用在一个类上。这样,在编译时遇到名为operator@的运算符函数(@表示所要重载的运算符),就检查传递给函数的参数的类型。

重载运算符与预定义运算符的使用方法完全相同,它不能改变原有运算符的参数个数(单目或双目),也不能改变原有的优先级的结合性。用户不能定义新的运算符,只能从C++已有的运算符中选择一个恰当的运算符重载。

3.1成员运算符函数

运算符函数可以定义为它将要操作的类的成员(称为成员运算符函数),也可以定义为非类的成员,但是非成员的运算符函数大多是类的友元函数(称为友元运算符函数)。

成员运算符函数在类中的声明格式为:

class X{

//……

type operator@(参数表);

};

其中type为函数的返回类型,@为所要重载的运算符符号,X是重载此运算符的类名,参数表中罗列的是该运算符所需要的操作数。

成员运算符函数定义的形式一般为:

type X::operator@(参数表)

//函数体}

其符号的含义与声明时相同。

在成员运算符函数的参数表中,若运算符是单目的,则参数表为空,此时当前对象作为运算符的一个操作数,通过this指针隐含地传递给函数的;若运算符是双目的,则参数表中有一个操作数,它作为运算符的右操作参数,此时当前对象做为运算符的左操作数,它是this指针隐含地传递给函数的。总之成员运算符函数operator@所需要的一个操作数是由对象通过this指针隐含传递。

3.2友元运算符函数

在C++中可以把运算符函数定义成某个类的友元函数,称为友元运算符函数。

友元运算符函数在类的内部声明格式如下:

friend type operator@(参数表)

定义友元运算符函数格式如下:

type operator@(参数表)

{ //函数体

}

与成员运算符函数不同,友元运算符函数是不属于任何类对象的,它没有this指针。若重载的是双目运算符,则参数表中有两个操作数;若重载的是单目运算符,则参数表中只有一个操作数。 不能用友元函数重载的运算符是=、()、[]、-〉,其余的运算符都可以使用友元函数来实现重载。

运算符函数调用形式如下表:

运算符函数调用形式

习惯形式 友元运算符函数调用形式 成员运算符函数调用形式

a+b operator(a,b) a.operator+(b)

-a operator-(a) a.operator-()

a++ operator++(a,0) a.operator++(0)

4.赋值运算符

继承C语言,用户自定义的类和结构都要能进行赋值运算。而数组名不能赋值,数组名实质上是一个常量指针。

对于任何类,C++提供了默认的赋值运算符。一般地,默认的赋值运算符重载是能够胜任工作的。当类中有指针类型时,需要自定义赋值运算符函数。一般其函数体包含两部分:

1)与析构函数类似,取消对象已经占有的资源;

2)与构造函数类似,在其中分配新的资源。

类的赋值运算符重载“=”只能重载为成员函数,不能重载为友元函数。

重载后的运算符函数operator=()不能被继承。

拷贝构造函数和赋值运算符重载的区别:声明和定义方式不同;调用方式不同。

5.虚函数

虚函数是重载的另一种表现形式,允许虚函数调用与函数体之间的联系在运行时才建立。

定义:虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数,在派生类中重新定义时,其函数原形包括返回类型,函数名,参数个数与参数类型的顺序,都必须与基类中的原形必须相同。

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

虚函数与重载函数的关系:当普通的函数重载时,其函数的参数或参数类型必须有所不同,函数的返回类型也可不同;在派生类中,重新定义虚函数时要求函数名、返回类型、参数个数、参数的类型和顺序与基类中的函数原形完全相同;若仅仅返回类型不同,其余均相同,系统会给出错误信息。虚函数重载时若仅仅函数名相同,而参数的个数、类型或顺序不同系统将它作为普遍函数重载,虚函数的特征将会丢失。

多重继承与虚函数:多重继承可视为多个单继承的组合。

6.纯虚函数和抽象类

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

纯虚函数的一般形式:virtual type func_name(参数表)=0(type是函数的返回类型,func_name是函数名)。

抽象类:一个类至少有一个纯虚函数的类。抽象类提供了处理各种不同派生类的统一接口,将实现的责任交给了派生类。

另外,站长团上有产品团购,便宜有保证


文章标题:c语言纯虚函数 c 纯虚函数
转载来于:http://scyanting.com/article/doodsgg.html