zoukankan      html  css  js  c++  java
  • 【c++题目003】关于析构

    Which statement is false?

    a) Destructors are called when a pointer is deleted.

    b) Destructors are called when an object goes out of scope.

    c) Destructors are called when a reference goes out of scope.

    d) A virtual destructor should be used if the class has virtual methods.

    e) Base class destructors are called after derived class destructors.

    /*
    关于析构
    Which statement is false?
    a) Destructors are called when a pointer is deleted.
    b) Destructors are called when an object goes out of scope.
    c) Destructors are called when a reference goes out of scope.
    d) A virtual destructor should be used if the class has virtual methods.
    e) Base class destructors are called after derived class destructors
    */
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <assert.h>
    using namespace std;
    
    class Parent
    {
    public:
    	virtual ~Parent()
    	{
    		cout << "~Parent" << endl;
    	}
    	virtual void func(){
    		cout << "Parent->func"<<endl;
    	}
    };
    class Son:public Parent
    {
    public:
    	virtual ~Son()
    	{
    		cout << "~Son" << endl;
    	}
    	virtual void func(){
    		cout << "Son->func" << endl;
    	}
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	//Parent * pParent = new Parent;
    	//{
    	//	Parent p; //超出作用域也要调用析构函数
    	//}
    	//cout << "delete pParent..." << endl;
    	//delete pParent; // delete对象指针时会调用析构函数
    
    	////////////////////////////////////////////////////////////////////////////
    	//Parent p;
    	//{
    	//	Parent& rP = p; //引用超出作用域时,是不会析构对象的,只是“引用而已”
    	//}
    
    
    	
    	//当通过子类指针析构子类对象 或者 子类对象超过作用域时
    	//不管析构函数是否是虚函数,都是先执行子类的析构函数,
    	//再调用父类的析构函数,这跟构造时的顺序相反
    	//Son s; 
    	//Son * s = new Son;
    	//delete s;
    
    
    	//当通过父类指针析构子类对象时,如果
    	//析构函数是虚函数,则delete时,根据子类对象的虚函数表,查到要调用的
    	//析构韩式是子类的版本,这时调用子类的析构函数,然后析构父类,才调用父类
    	//的析构函数
    	//但当析构函数不是虚函数时,将直接调用父类的析构函数,而不会调用子类的析构函数,会造成资源泄漏
    //所以一般有继承关系的类,都要将析构函数定义为虚函数 Parent * s = new Son; //s->func(); delete s; }

    另外,对于virtual这个关键词,一般在父类中的方法定义了之后,子类不需再写virtual也是虚函数,但为了清楚起见,凡是虚函数都最好写上virtual

  • 相关阅读:
    Linux下修改Mysql最大并发连接数
    linux ORACLE备份还原(EXPIMP)
    免安装Oracle客户端使用PL/SQL连接Oracle
    连接ORACLE客户端工具navicat111.12 for oracle
    安装Oracle 11.2.0.3 Client Win 32-bit
    sharepoint 2013创建网站集,域帐户无法访问,只有administrator可以访问
    VS2013 ERROR SCRIPT5009: “WebForm_AutoFocus”未定义
    TimeUnit类 java.util.concurrent.TimeUnit
    Redis: 分布式锁的正确实现方式(转)
    java synchronized实现可见性对比volatile
  • 原文地址:https://www.cnblogs.com/speedmancs/p/2072713.html
Copyright © 2011-2022 走看看