湖北省罗田教育信息网:C++中的virtual关键字是什么?怎么用?

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/03 07:42:47
简单 详细都可以 谢谢

virtual是定义C++中虚函数的关键字 。

1、virtual关键字的作用:

c++中的函数调用默认不适用动态绑定。要触发动态绑定,必须满足两个条件:第一,指定为虚函数;第二,通过基类类型的引用或指针调用。由此可见,virtual主要功能是实现动态绑定。

2、virtual关键字的使用情况:

virtual可用来定义类函数和应用到虚继承。

友元函数 构造函数 static静态函数 不能用virtual关键字修饰;

普通成员函数 和析构函数 可以用virtual关键字修饰。

3、virtual关键字的效果:

class GrandFather //祖父类

{  

public:  

GrandFather() {}  //构造函数

virtual void fun()  //虚函数声明定义

{  

cout << "GrandFather call function!" << endl;  

}  

};  

class Father : public GrandFather//父类,公有继承祖父类 

{  

public:  

Father() {}  //构造函数

void fun()   //fun函数声明定义

{  

cout << "Father call function!" << endl;  

}  

};  

class Son : public Father  //子类,公有继承父类

{  

public:  

Son() {}  //构造函数

void fun()  //fun函数声明定义

{  

cout << "Son call function!" << endl;  

}  

};  

void print(GrandFather* father) //输出函数 ,祖父类形参

{  

father->fun();  //调用fun函数

}  

int _tmain(int argc, _TCHAR* argv[])  

{  

Father * pfather = new Son;//建立一个父类的指针让它指向子类

pfather->fun();  

GrandFather * pgfather = new Father;  

print(pgfather); //祖父类指针变量 

return 0;  }  

4、virtual的继承性:

只要基函数定义了virtual,继承类的该函数也就具有virtual属性;即 GrandFather, Father ,Son同时定义virtual void fun()与GrandFather一个定义virtual void fun效果是一样的。

扩展资料

vitual关键字的用途:

1、vitual基类

在多重继承中,从派生类到基类存在多条路线时(多个继承脉络或者途径),一个这种派生类的对象实例化将包含多个基类对象,浪费资源且调用混乱的现象出现。

因此引入了vitual baseclass,来在运行阶段克服多个基类对象的产生。这个vitual是在运行阶段保证对象唯一性的。

2.vitual函数

虚函数的出现,是由于基类的指针可以执行派生类,因此引出了不便,引入vitual函数,来告诉编译器,出现这种情况时,在运行时动态链接进行处理。

3.vitual在纯虚函数中使用

纯虚函数完全是为了继承体系的完整,也是集成vitual函数的作用而产生的。代表了编译器阶段对象的绑定,将调用选择转移到运行时动态绑定。

综上:vitual关键的引入,可以理解为阻止编译阶段的静态绑定,将绑定(虚函数)和约束工作(虚基类)转移到运行时动态处理。


参考资料:百度百科——virtual

virtual是定义C++中虚函数的关键字 。

在使用virtual之前,C++对成员函数使用静态联编,而使用virtual,并且在调用函数时是通过指针或引用调用,C++则对成员函数进行动态联编。

用法:

class Base

{

public:Base(){}

public:

virtual void print(){cout<<"Base";}

}; 

class Derived:public Base

{

public:Derived(){}

public:

void print(){cout<<"Derived";}

}; 

int main()

{

Base *point=new Derived();

point->print();

}

Output:

Derived 

扩展资料

C++11 关键字共73个。

新增关键字:alignas、alignof、char16_t、char32_t、constexpr、decltype、noexcept、nullptr、static_assert、thread_local。

export 因为实现支持太少(仅Edison Design Group的前端支持),编译效率低下,取消原有意义(仍是关键字,但使用它的程序是错误的),改为保留给未来标准使用。

1、alignas

alignof用于获取取指定表达式指定的(类似sizeof,可以直接是类型名)的对齐(alignment)。alignas用于声明时指定对齐类似于现有的类型。和sizeof类似,两者的操作数都不被求值。

2、constexpr

类似const但更强大,修饰函数或对象,表示函数结果或对象是编译时决定的常量,以便优化。(const不能修饰一般的函数,也不一定指定声明的对象能编译期的常量表达式,更可能只是只读对象。而在C语言中,const完全只能指定只读对象。)

3、char16_t 和 char32_t

二者分别表示16位字符型和32位字符型,类似char和wchar_t,也是一般只专用于表示字符的整数类型,且设计上用于表示Unicode字符。char16_t和char32_t是C++11新增的,以克服wchar_t在不同平台上无法保证确定宽度的缺点。

参考资料来源:百度百科--virtual

virtual是定义C++中虚函数的关键字 。

在使用virtual之前,C++对成员函数使用静态联编,而使用virtual,并且在调用函数时是通过指针或引用调用,C++则对成员函数进行动态联编。

一、概念

1、以继承为前提。

2、在父类中用virtual修饰函数。

3、在子类中重写该虚函数。

二、作用

1、以父类的引用作为函数的参数类型。

2、调用该函数传递子类对象。

3、在函数中可以通过该父类的引用调用到子类中重写的虚函数。

三、用法

class 类名{
public:
virtual 成员函数说明;
}

class 类名:基类名{
public:
virtual 成员函数说明;
}

扩展资料

定义虚函数的限制:

(1)非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。实际上,优秀的程序员常常把基类的析构函数定义为虚函数。

因为,将基类的析构函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。

(2)只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。

(3)当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数(函数名相同、参数列表完全一致、返回值类型相关)自动成为虚函数。

(4)如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。

参考资料来源:百度百科—virtual

是定义C++中虚函数的关键字。

演示使用的代码:

class Base

{

public:Base() {}

public:

virtual void print() { cout << "Base"; }

};

class Derived :public Base

{

public:Derived() {}

public:

void print() { cout << "Derived"; }

};

void main() {

Base *point = new Derived();

point->print();

getchar();

}

代码截图:

扩展资料:

虚函数的定义

简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。

虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。

即:指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。

参考资料:百度百科-虚函数

参考资料:百度百科-virtual

Virtual是C++ OO机制中很重要的一个关键字,在类Base中加了Virtual关键字的函数就是虚拟函数。

关键字Virtual的用法:

#include<iostream> 

using namespace std;

class A{

public:

virtual  void  display(){  cout<<"A"<<endl; }

};

class B :  public A{

public:

void  display(){ cout<<"B"<<endl; }

};

void doDisplay(A *p)

{

p->display();

delete p;

}

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

{

doDisplay(new B());

return 0;

}

这段代码打印出的结果为B,但是当把A类中的virtual去掉之后打印出的就为A。当基类中没有virtual的时候,编译器在编译的时候把p看做A类的对象,调用的自然就是A类的方法。

但是加上virtual之后,将dispaly方法变成了虚方法,这样调用的时候编译器会看调用的究竟是谁的实例化对象,这样就实现了多态的效果。

也就是说,当基类的派生类中有重写过基类的虚方法的时候,使用基类的指针指向派生类的对象,调用这个方法实际上调用的会是派生类最后实现的方法。

扩展资料:

关于C++的隐藏规则:

1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

2、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。