C++中virtual相关的知识

来源:互联网 发布:盛睿途网络 编辑:程序博客网 时间:2024/06/14 16:41

virtual 关键字,在c++中的主要应用如下:
1,virtual修饰类中的成员函数,叫做虚函数;
a,一般的虚函数:
主要体现是类继承的多态性(运行时动态绑定);如在基类A中定义一个虚函数 virtual void f(),那么在A的继承类B中可以对A中的虚函数进行重定义,得到不同的实现。
另一方面,定义一个基类的指针或者引用对象,然后应用子类的地址或者引用(对象)对它进行初始化,那么可以应用该指针访问子类中的虚函数的同名函数;
如:B b1; A* a1=&b1 (A &a2=b1); a1->f()(a2.f())对应的是B中的f()函数,这样做也可以隐藏B类的作用,有封装的作用。

class A{    public:    virtual void f(){cout<<"hello"<<name<<endl;}    private:    name;}class B:public A{    public:     void f(){cout<<"hello"<<age<<endl;}    private:    age;}

b, 纯虚函数
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。纯虚函数的定义形式:virtual f(){ } = 0;
有纯虚函数的类叫做抽象类,不可以产生实例,只能被继承,且纯虚函数需在在子类中实现,不然子类也将成为抽象类。
c,虚析构函数
这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。如A*P=new B; p->f();delete p;。当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。
基类的析构函数不是虚函数,会带来什么问题?
会产生内存泄漏。
如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏。
d,虚函数表
包含虚函数的类中会默认存在一个指向虚函数表的指针。
包含虚函数的类才会有虚函数表, 同属于一个类的对象共享虚函数表, 但是有各自的地址.
虚函数表实质是一个指针数组,里面存的是虚函数的函数指针。
http://www.cnblogs.com/hushpa/p/5707475.html
2,virtual在类的继承中应用,叫做虚继承;
虚继承的主要作用是解决类继承中的二义性问题。
为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。
class 派生类名:virtual 继承方式 基类名

原创粉丝点击