就是加上virtual关键字的类成员函数,效果和纯虚函数有所差别:
1 定义了纯虚函数的类是抽象类,不能被实例化。而定义了虚函数的类可以。
2 定义了虚函数的基类指针调用虚函数时,如果指向派生类并且派生类覆盖定义了虚函数,那么会调用派生类的这个函数。否则调用基类的这个函数。
3 如果派生类覆盖定义了基类的函数(没有virtual),那么基类指针指向派生类的时候调用的依然是基类的函数。
class A
{
public:
virtual int show(){}
int func(){}
};
class B:public A
{
public:
int func(){}
int show(){}
};
int main(int argc, char const *argv[])
{
A * ptr = new B();
ptr->func();//调用基类的func
ptr->show();//调用派生类的show
return 0;
}
这里面扯到一个多态问题,你自己去百度看看比较好。
C++中并没有方法的概念。方法(method)实际上是java的概念。在C++中,方法被称为函数。
所以虚方法的准确说法是虚函数。在C++中,是一种特别的类成员函数。
在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};
实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
也就是说被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。
示例代码:
#include<iostream>
using namespace std;
class A
{
public:
virtual void print(){cout<<"This is A"<<endl;}
};
class B : public A
{
public:
void print(){cout<<"ThisisB"<<endl;}
};
int main()
{
A a;
B b;
a.print();
b.print();
((A*)&b)->print();
return 0;
}
在这个代码中,A的成员函数print就是虚函数。当被继承时,print函数将被B中的print函数覆盖。这时在B的对象b中,使用基类指针访问print,结果仍是B的print输出。
于是第三行会输出ThisisB。
而如果A中的print不加virtual,这个输出将是this is A。
由于类包含的内容比较广,下面还有不同的子类,虽然操作的名称相同,但是对于不同的子类,其具体实现不同。因此,在本类中无法统一表达;但是另一方面,此类操作具有共性,因此使用一个统一的命名。其具体的实现,有各个不同的子类完成。
广告 您可能关注的内容 |