首页 > 编程知识 正文

虚函数与纯虚函数的区别,纯虚函数是虚函数吗

时间:2023-05-03 05:24:44 阅读:255386 作者:3553

1、纯虚函数声明如下: virtual void funtion1()=0;
纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。

2、虚函数声明如下:virtual ReturnType
FunctionName(Parameter);虚函数必须实现,如果不实现,编译器将报错,错误提示为: error LNK****:
unresolved external symbol “public: virtual void __thiscall
ClassName::virtualFunctionName(void)”

3、对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。

4、实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。

5、虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。

6、在有动态分配堆上内存的时候,析构函数必须是虚函数,但没有必要是纯虚的。

7、友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。

8、析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。

有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。定义纯虚函数就是为了让基类不可实例化化, 因为实例化这样的抽象数据结构本身并没有意义. 或者给出实现也没有意义
实际上我个人认为纯虚函数的引入,是出于两个目的,

1、为了安全.因为避免任何需要明确但是因为不小心而导致的未知的结果.提醒子类去做应做的实现。
2、为了效率,不是程序执行的效率,而是为了编码的效率。

#include <iostream>using namespace std;class base{public: virtual void f(){ cout << "i am base f" << endl; } void g(){ cout << "i am base g" << endl; } void y(){ cout << "i am base y" << endl; }};class base2{public: virtual void f(){ cout << "i am base2 f" << endl; } void g(){ cout << "i am base2 g" << endl; } void y(){ cout << "i am base2 y" << endl; }};class Child final:public base, public base2{public: void f(){ cout << "i am child f" << endl; } void g(){ cout << "i am child g" << endl; } void m(){ cout << "i am child m" << endl; }};class vbase{public: virtual void f()=0; virtual void g(){ cout << "i am vbase g" << endl; };};class vchild: public vbase{public: virtual void f(){ cout << "i am vchild f" << endl; }};int main() { Child a;base *p = &a;base2 *p2 = &a;Child *q = &a;p->f();p->g();//p->m(); //非法访问,父类不能访问子类没有重写的函数,尽管在虚函数表中有子类自有函数的地址。p2->f();p2->g();q->f();q->g();q->base::y(); // 添加操作域q->base2::y(); // 添加操作域//纯虚函数cout << "nnvbase" << endl;vbase *va = new vchild();va->g();va->f();return 0;}

输出:

i am child fi am base gi am child fi am base2 gi am child fi am child gi am base yi am base2 yvbasei am vbase gi am vchild f

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。