问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

什么是虚函数?

发布网友 发布时间:2022-04-28 16:13

我来回答

6个回答

懂视网 时间:2022-05-04 05:35

#include iostream using namespace std; class Base { public: virtual void show() { coutBaseendl; } }; class De:public Base { private: virtual void show() { coutDeriendl; } }; void main() { Base *p = new De; p-show(); //OK,Output : Deri }

#include
using namespace std;

class Base
{
public:
virtual void show() {
cout<<"Base"< }
};

class De:public Base
{

private:
virtual void show() {
cout<<"Deri"< }
};

void main()
{
Base *p = new De;
p->show(); //OK,Output : Deri
}
当把基类和派生类的public,private互换时,
error #308: function "Base::show" is inaccessible
p->show();

可见类虚拟成员函数的访问性是由调用该函数的指针决定的
(本程序中是由p的类型)

#include
using namespace std;

class Base
{
public:
virtual void show() {
cout<<"Base"< }
};

class De:public Base
{

private:
virtual void show() {
cout<<"Deri"< }
};

void Test(Base& p)
{
p.show();
}

void main()
{
Base *p = new De;
p->show(); //OK output : Deri

Base ba;
Test(ba); //OK : base

De da;
Test(da); //OK : Deri
}

热心网友 时间:2022-05-04 02:43

虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式:
  virtual
函数返回值类型
虚函数名(形参表)
  {
函数体
}
 虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
  当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。
  ([2010.10.28]
注:下行语义容易使人产生理解上的偏差,实际效果应为:
  如存在:Base
->
Derive1
->
Derive2
及它们所拥有的虚函数func()
  则在访问派生类Derive1的实例时,使用其基类Base及本身类型Derive1,或被静态转换的后续派生类Derive2的指针或引用,均可访问到Derive1所实现的func()。)
  动态联编规定,只能通过指向基类的指针或基类对象的引用来调用虚函数,其格式:
  指向基类的指针变量名->虚函数名(实参表)
  或
基类对象的引用名.
虚函数名(实参表)
  虚函数是C++多态的一种表现
  例如:子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virtual(虚函数)。
  使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。
如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virtual
函数名=0
我们把这样的函数(方法)称为纯虚函数。
  如果一个类包含了纯虚函数,称此类为抽象类

虚函数的实例
  #include<iostream.h>
  class
Cshape
  {
public:
void
SetColor(
int
color)
{
m_nColor=color;}
  void
virtual
Display(
void)
{
cout<<"Cshape"<<endl;
}
  private:
  int
m_nColor;
  };
  class
Crectangle:
public
Cshape
  {
  public:
  void
virtual
Display(
void)
{
cout<<"Crectangle"<<endl;
}
  };
  class
Ctriangle:
public
Cshape
  {
  void
virtual
Display(
void)
{
cout<<"Ctriangle"<<endl;
}
  };
  class
Cellipse
:public
Cshape
  {
  public:
void
virtual
Display(void)
{
cout<<"Cellipse"<<endl;}
  };
  void
main()
  {
  Cshape
obShape;
  Cellipse
obEllipse;
  Ctriangle
obTriangle;
  Crectangle
obRectangle;
  Cshape
*
pShape[4]=
  {
&obShape,
&obEllipse,&obTriangle,
&
obRectangle
};
  for(
int
I=
0;
I<
4;
I++)
  pShape[I]->Display(
);
  }
  本程序运行结果:
  Cshape
  Cellipse
  Ctriangle
  Crectangle
条件
  所以,从以上程序分析,实现动态联编需要三个条件:
  1、
必须把动态联编的行为定义为类的虚函数。
  2、
类之间存在子类型关系,一般表现为一个类从另一个类公有派生而来。
  3、
必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。

热心网友 时间:2022-05-04 04:01

可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时,
基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,
而不是基类中定义的成员函数(只要派生类改写了该成员函数)。
若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都
会调用基类中定义的那个函数。


class A
{
virtual void AAA()
{
cout<<"这是基类的!";
}
};
class a:A
{
void AAA()
{
cout<<"这是派生类a!";
}
};

然后你生成a的实例,调用AAA()方法时,程序调用的是a中的AAA,而不是A中的AAA
如果你不定义virtual,在生成a的实例后调用的是基类的AAA()

热心网友 时间:2022-05-04 05:36

热心网友 时间:2022-05-04 07:27

函数的传统定义:
设在某变化过程中有两个变量x、y,如果对于x在某一范围内的每一个确定的值,y都有唯一确定的值与它对应,那么就称y是x的函数,x叫做自变量。
我们将自变量x取值的集合叫做函数的定义域,和自变量x对应的y的值叫做函数值,函数值的集合叫做函数的值域。
函数的近代定义:
设A,B都是非空的数的集合,f:x→y是从A到B的一个对应法则,那么从A到B的映射f:A→B就叫做函数,记作y=f(x),其中x∈A,y∈B,原象集合A叫做函数f(x)的定义域,象集合C叫做函数f(x)的值域,显然有CB。

热心网友 时间:2022-05-04 09:35

虚函数表示函数是以间接的方式被调用,而不是由一个固定的函数入口地址来调用,一个函数调用可以对应不同的函数入口地址。
虚函数除了不能作为内联函数外,它遵循普通成员函数的所有语法规则。
函数声明语法:virtual return_type name( arguments );
在函数的定义部分和它的派生类的声明部分无需重复使用virtual关键字,它的所有派生类都保持virtual类型。
把函数转变为虚函数的作用是为了配合通过基类指针访问某一对象的操作。
如果在派生类里没有对某一函数进行重载,也就不必把此函数声明成虚函数。在进行函数调用时,虚函数的表现要略逊于普通函数,而且它也比代码相同的实函数占据较多的内存空间。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你见过最古老的东西是什么,有多少年历史 WORD中怎么输出稿纸模式word中怎么输出稿纸模式 女性尿检阴性是什么意思 阴性尿检是什么意思 尿检阴性是什么 win10如何查看电脑配置参数 win10怎样查看电脑配置参数 多地对公职人员提接种要求 亚马逊订单可以退回任何Kohl's商店,7月份生效 亚马逊提供免费退货,珠宝退货卖家要承担运费吗 新的亚马逊退货政策惹争议!官方解答来了 支付宝里怎么退出12306账号? 答:下载飞猪APP-火车票-然后点击左下12306 c++在类定义的外部,可以被访问 支付宝如何退出12306 下面函数中,可以作为虚函数的是( ) 在自己的支付宝里登录别人的12306账号,怎么把12306退出来? 建立转发文章平台 就是微信转发点击给钱的那个 定速巡航有必要吗? 汽车定速巡航好不好?是必须的吗 定速巡航的作用是什么? 投影仪锁屏后怎么解决 现在有些车基本上都有定速巡航功能,但是为什么很多老司机都不用? 帕萨特一直开定速巡航对车子有影响吗 定速巡航安全吗 高速公路开定速危险吗 投影机与电脑连接如何固定投影画面 怎么让投影的画面定格 而笔记本上画面可以调整 什么是定速巡航?开高速的时候使用定速巡航安全吗? 投影机放的时候不让显示自己的操作 为什么新车不建议用定速巡航? 加装定速巡航有啥安全隐患 怎么退出支付宝里的12306? 我给别人点击多个微信转发的文章,多个平台的,好多,会不会被封号啊? 下面函数中,可以作为虚函数的是( ) A 普通函数 B 默认构造函数 C 带参构造函数 D 析构函数 c++中的虚函数可以是? 支付宝上的12306账号怎么注销 C++中什么样的函数可以作为虚函数? 构造函数和析构函数可以是虚函数吗 支付宝怎么退火车票 我在支付宝上订了动车票,我想退票了,上12306怎么退,求过程,谢谢,高分求。 c++什么是虚函数,构造与析构函数可以是虚函数吗? 支付宝怎么解除12306绑定 符号重载函数能作为基类的虚函数么? 12306怎么解除绑定支付宝 unity awake函数可以作为虚函数吗 支付宝绑定12306怎么解除掉? 小米手机通话时可以变声吗? 什么情况下,类的析构函数应该声明为虚函数?为什么? 虚函数是用来做什么的? C++中虚函数的作用是什么?它应该怎么用呢? 重载操作符作为虚函数的问题