实例讲解C++编程中的虚函数与虚基类

2025-05-29 0 88

虚函数

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41
#include "stdafx.h"

#include <iostream>

using namespace std;

class B0//基类B0声明

{

public:

void display(){cout<<"B0::display()"<<endl;}//公有成员函数

};

class B1: public B0//公有派生类B1声明

{

public:

void display(){cout<<"B1::display()"<<endl;}//公有成员函数

};

class D1: public B1//公有派生类D1声明

{

public:

void display(){cout<<"D1::display()"<<endl;}//公有成员函数

};

void fun(B0 *ptr)//普通函数

{//参数为指向基类对象的指针

ptr->display();//"对象指针->成员名"

}

void main()//主函数

{

B0 b0;//声明基类B0类对象

B1 b1;//声明B1类对象

D1 d1;//声明D1类对象

B0 *p;//声明B0类指针

p=&b0;//B0类指针指向B0类对象,

fun(p);

p=&b1;//B0类指针指向B1类对象,指向基类的指针也可以指向派生类。

fun(p);

p=&d1;//B0类指针指向D1类对象,指向基类的指针也可以指向派生类。

fun(p);

}

输出结果:

?

1

2

3

4
B0::display()

B0::display()

B0::display()

Press any key to continue

类型兼容规则举例

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41
#include "stdafx.h"

#include <iostream>

using namespace std;

class B0//基类B0声明

{

public:

virtual void display(){cout<<"B0::display()"<<endl;}//公有成员函数

};

class B1: public B0//公有派生类B1声明

{

public:

void display(){cout<<"B1::display()"<<endl;}//公有成员函数

};

class D1: public B1//公有派生类D1声明

{

public:

void display(){cout<<"D1::display()"<<endl;}//公有成员函数

};

void fun(B0 *ptr)//普通函数

{//参数为指向基类对象的指针

ptr->display();//"对象指针->成员名"

}

void main()//主函数

{

B0 b0;//声明基类B0类对象

B1 b1;//声明B1类对象

D1 d1;//声明D1类对象

B0 *p;//声明B0类指针

p=&b0;//B0类指针指向B0类对象,

fun(p);

p=&b1;//B0类指针指向B1类对象,指向基类的指针也可以指向派生类。

fun(p);

p=&d1;//B0类指针指向D1类对象,指向基类的指针也可以指向派生类。

fun(p);

}

输出结果:

?

1

2

3

4
B0::display()

B1::display()

D1::display()

Press any key to continue

虚函数是为了实现某种功能而假设的函数,虚函数只能是类中的一个成员函数,不能是静态成员,使用关键字virtual用于在类中说明该函数是虚函数虚函数更是为了实现面向对象的多态性而产生的,使用虚函数和多态

性能够简化代码长度,支持更简单的顺序,便于程序的调试,维护。
虚函数的定义方法:

?

1

2

3

4

5

6
class A

{

public:

virtual void fun(); //define virtual function

};

void A::fun() { ... } //member function describe

上面定义了一个虚函数,然后在类体外进行了函数的具体描述。

在类的继承当中,当基类中声明了某个虚函数,即使在派生类中没有声明虚函数,那么在以后的继承结构中都是

虚函数,当然如果有多重继承,在每个派生类中还是推荐对每个虚函数进行显式的声明。

为了说明虚函数在派生类中的应用,我写段代码作例子:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48
#include "stdio"

class cbase

{

public:

virtual void vfoo()

{

printf("vfoo from cbase/n");

};

void foo()

{

printf("foo from cbase/n");

}

};

class cderivd : public cbase

{

public:

virtual void vfoo()

{

printf("vfoo from cderivd/n");

};

void foo()

{

printf("foo from cderivd/n");

};

};

int main(int argc, char* argv[])

{

cbase* pbase = new cderivd();

pbase->foo(); //非虚函数,根据指针类型决定调用哪个foo,本例指针类型为cbase,所以调用的是cbase::foo()

pbase->vfoo(); //虚函数,调用的是派生类的vfoo

delete pbase;

cderivd* pd = new cderivd();

pd->foo(); //非虚函数,本例指针类型为cderivd*,所以调用cderivd::foo();

pd->vfoo();

delete pd;

cderivd d;

d.foo();

d.vfoo();

((cbase)d).foo(); //将d强行切割为cbase,这时调用的无论是foo还是vfoo都将是base的

((cbase)d).vfoo();

getchar();

return 0;

}

程序在DevCPP下编译通过,输出:

?

1

2

3

4

5

6

7

8
foo from cbase

vfoo from cderivd

foo from cderivd

vfoo from cderivd

foo from cderivd

vfoo from cderivd

foo from cbase

vfoo from cbase

虚基类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59
#include "stdafx.h"

#include<iostream>

#include<string>

using namespace std;

class person{//声明基类

protected:

int age;

char sex;

string name;

public:

person(int a,char s,string nam){

age=a;

sex=s;

name=nam;

}

};

class teacher:virtual public person

{

protected:

string title;

public:

teacher(int a,char s,string nam,string t):person(a,s,nam){

title=t;

}

};

class student:virtual public person

{

protected:

float score;

public:

student(int a,char s,string nam,float sc):person(a,s,nam){

score=sc;

}

};

class graduate:public teacher,public student

{

protected:

float wdge;

public:

graduate(int a,char s,string nam,string t,float sc,float wd):person(a,s,nam),teacher(a,s,nam,t),student(a,s,nam,sc){

wdge=wd;

}

void show(){

cout<<name<<endl;

cout<<age<<endl;

cout<<sex<<endl;

cout<<title<<endl;

cout<<score<<endl;

cout<<wdge<<endl;

}

};

int main(){

graduate gr(22,'f',"k;asdjf;daf","klsdaf",89.5,79.5);

gr.show();

return 0;

}

输出结果:

?

1

2

3

4

5

6

7
k;asdjf;daf

22

f

klsdaf

89.5

79.5

Press any key to continue

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 实例讲解C++编程中的虚函数与虚基类 https://www.kuaiidc.com/106653.html

相关文章

发表评论
暂无评论