zoukankan      html  css  js  c++  java
  • 虚函数

    1.这个程序清楚地示范了基类的函数是如何调用派生类的虚函数的。这一技术被用于不同的框架中,例如MFC和设计模式(比如Template Design Pattern)。现在你可以修改一下这个程序来看看它的行为,我将要在基类的构造函数中调用虚函数,而不是普通的成员函数。

    #include <iostream>
    using namespace std;
    class Base
    {
    public:
    	virtual void fun()
    	{
    		cout << "Base::fun" << endl;
    	}
    	void show()
    	{
    		fun();
    	}
    };
    class Drive: public Base
    {
    public:
    	virtual void fun()
    	{
    		cout << "Drive::fun" << endl;
    	}
    };
    int main()
    {
    	Drive d;
    	d.show();
    	d.fun();
    	system("pause");
    	return 0;
    }
    //Drive::fun
    //Drive::fun

    2.这个程序表明,我们不能在基类的构造函数中调用派生类的虚函数。

    #include <iostream>
    using namespace std;
    class Base
    {
    public:
    	Base()
    	{
    		fun();
    	}
    	virtual void fun()
    	{
    		cout << "Base::fun" << endl;
    	}
    };
    class Drive: public Base
    {
    public:
    	virtual void fun()
    	{
    		cout << "Drive::fun" << endl;
    	}
    };
    int main()
    {
    	Drive d;
    	d.fun();
    	system("pause");
    	return 0;
    }
    //Base::fun
    //Drive::fun

    3.这就表示,整个内存位置中,只有一个对象存在。

    #include <iostream>
    using namespace std;
    class Base
    {
    public:
    	Base()
    	{
    		cout << "In Base" << endl;
    		cout << "This Pointer = " << (int*) this << endl;
    		cout << endl;
    	}
    	virtual void fun()
    	{
    		cout << "Base::fun" << endl;
    	}
    };
    class Drive: public Base
    {
    public:
    	Drive()
    	{
    		cout << "In Drive" << endl;
    		cout << "This Pointer = " << (int*) this << endl;
    		cout << endl;
    	}
    	virtual void fun()
    	{
    		cout << "Drive::fun" << endl;
    	}
    };
    int main()
    {
    	Drive d;
    	cout << "In Main" << endl;
    	cout << "In Main = " << (int*) &d << endl;
    	system("pause");
    	return 0;
    }
    /*
    In Base
    This Pointer = 0xbfffe47c
    In Drive
    This Pointer = 0xbfffe47c
    In Main
    In Main = 0xbfffe47c
    */
    


    4.纯虚析构函数

    在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。
    这里是一个例子:
    class awov
    {
     public:
     virtual ~awov() = 0; // 声明一个纯虚析构函数
    };
    这个类有一个纯虚函数,所以它是抽象的,而且它有一个虚析构函数,所以不会产生析构函数问题。但这里还有一件事:必须提供纯虚析构函数的定义:
    awov::~awov() {} // 纯虚析构函数的定义
    这个定义是必需的,因为虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。这就是说,即使是抽象类,编译器也要产生对~awov的调用,所以要保证为它提供函数体。如果不这么做,链接器就会检测出来,最后还是得回去把它添上。
    构造函数不能是虚的。只能有虚的析构函数

  • 相关阅读:
    搭建微信公众号,获取用户公开信息
    搭建ES搜索引擎,实时导入mysql数据进行查询
    切换linux的shell
    隐藏CMD窗口,使程序在后台执行
    通过ssh远程查看java版本与在客户端查看不一致
    项目升级tomcat,修复漏洞
    springboot重定向后,https变成http
    【数论】【Polya定理】【枚举约数】【欧拉函数】【Java】poj2154 Color
    【数论】【Polya定理】poj1286 Necklace of Beads
    【置换群】poj3270 Cow Sorting
  • 原文地址:https://www.cnblogs.com/byfei/p/14104681.html
Copyright © 2011-2022 走看看