zoukankan      html  css  js  c++  java
  • c++使用技巧: 不要在构造函数/析构函数中调用虚函数

    构造函数中调用虚函数将会因为派生类没有完成自身的初始化,而使得只能调用基类的虚函数定义,如果基类没有给出虚函数的实现,则会编译出错时出错(LNK2019没有找到对应函数的实现)。


    析构函数中调用虚函数(同时需要保证基类析构函数是虚函数,否则删除基类指针将不会调用派生类得析构函数)。

    测试代码:

    class Base
    {
    public:
    	Base()
    	{
    		cout<<"Base::Base"<<endl;
    		Fun();
    	}
    	virtual ~Base()
    	{
    		cout<<"Base::~Base"<<endl;
    		Fun1();
    	}
    private:
    	virtual void Fun() = 0;
    	virtual void Fun1();
    };
    void Base::Fun()
    {
    	cout<<"Base::Fun"<<endl;
    }
    void Base::Fun1()
    {
    	cout<<"Base::Fun1"<<endl;
    }
    class Derived : public Base
    {
    public:
    	Derived()
    	{
    		cout<<"Derived::Derived"<<endl;
    		Fun();
    	}
    	~Derived()
    	{
    		cout<<"Derived::~`Derived"<<endl;
    		//Fun1();
    	}
    private:
    	virtual void Fun();
    	virtual void Fun1();
    };
    void Derived::Fun()
    {
    	cout<<"Derived::Fun"<<endl;
    }
    void Derived::Fun1()
    {
    	cout<<"Derived::Fun1"<<endl;
    }
    如果基类以及派生类各自拥有不同的申请资源建议使用同名的函数放在析构函数中,不建议使用虚函数声明,否则将会有种假象,不过注意小心重复删除(保证各自释放资源是针对自身分配,或者统一由派生类来申请基类以及自身的资源。)。

  • 相关阅读:
    pytorch的函数中的group参数的作用
    pytorch的函数中的dilation参数的作用
    resnet18全连接层改成卷积层
    Pytorch实现UNet例子学习
    MyEclipse中出现Address already in use:JVM_Bind:8080
    为SQL数据库创建登录名和密码
    集合体系
    排序算法及其java实现
    java泛型通配符?
    Arrays.asList的用法
  • 原文地址:https://www.cnblogs.com/rogerroddick/p/2846707.html
Copyright © 2011-2022 走看看