首先
定义一个函数为虚函数,不代表函数不被实现,是为了允许基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数未被实现,纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
class A
{
public:
virtual void foo()
{
cout<<"A::foo() is called"<<endl;
}
};
class B:public A
{
public:
void foo()
{
cout<<"B::foo() is called"<<endl;
}
};
int main(void)
{
A *a = new B();
a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
return 0;
}
————————————————
版权声明:本文为CSDN博主「hackbuteer1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hackbuteer1/article/details/7558868
虚函数虚就虚在“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定,而是在运行时刻被确定的。由于编写代码时不能确定被调用的是基类的函数还是哪个派生类的函数,所以被称为“虚”函数。
虚函数只能借助于指针或者引用来达到多态的效果。
C++纯虚函数
一、定义
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法,在基类中实现纯虚函数的方法是在函数原型后加“=0”
virtual void funtion() = 0
二、引入原因
1.为了方便使用多态特性,我们常常需要在基类中定义虚函数。
2.在很多情况下,基类本身商城对象是不合情理的,如动物类,将函数定义为纯虚函数,编译器会要求在派生类中必须予以重写实现多态性。同时含有纯虚函数的类称为抽象类,不可生成对象。
纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的 = 0), 否则该派生类也不能实例化。
抽象类的介绍
抽象类是一种特殊的类,它是为了抽象和设计的目的建立的,它处于继承层次结构的较上层。
1.定义:带有纯虚函数的类为抽象类
2.作用:主要作用是将有关操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。
3.注意:抽象类只能作基类使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。
总结
1、纯虚函数声明如下: virtual void funtion1()=0; 纯虚函数一般没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。
2、虚函数声明如下:virtual ReturnType FunctionName(Parameter);虚函数必须实现,如果不实现,编译器将报错,错误提示为:
error LNK****: unresolved external symbol "public: virtual void __thiscall ClassName::virtualFunctionName(void)"
3、对于虚函数来说,父类和子类都有各自的版本。由多态方式调用时动态绑定。
4、虚函数是C++中用于实现多态(polymorphism)的机制,核心理念就是通过基类访问派生类定义的函数。
5、在动态分配堆上内存的时候,析构函数必须是虚函数,但是没有必要时纯虚的。
6、友元函数不是成员函数,故不能是虚函数,但可以调用虚函数。
7、析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。
作者认为纯虚函数的引入,是出于两个目的
1、为了安全,因为避免任何需要明确但因不小心导致的未知的结果,提醒子类去做相应的实现。
2、为了效率,不是程序执行的效率,而是为编码的效率。