其他分享
首页 > 其他分享> > 虚函数与纯虚函数

虚函数与纯虚函数

作者:互联网

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

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 << "\n\nvbase" << endl;
	vbase *va = new vchild();
	va->g();
	va->f();
	return 0;
}

输出:

i am child f
i am base g
i am child f
i am base2 g
i am child f
i am child g
i am base y
i am base2 y


vbase
i am vbase g
i am vchild f

标签:cout,子类,void,am,纯虚,函数
来源: https://blog.csdn.net/XianAnn/article/details/121077382