c++-请问C++析构函数的问题。

问题描述

请问C++析构函数的问题。


#include

using namespace std;

class A
{
public:
A(){cout<<"Build A"<<endl;}
~A(){cout<<"Destroy A"<<endl;}
};

class B:public A
{
public:
B():A(){cout<<"Build B"<<endl;}
~B(){cout<<"Destroy B"<<endl;}
};

int main()
{
B Out();
return 0;
}
我想看一看:
创建B对象的时候 AB的构造函数和析构函数分别是怎么调用的。谢谢。
但是为什么程序没有输出结果。


解决方案

C++ 析构函数
C++中基类的虚析构函数问题
c++ 析构函数为虚函数的问题

解决方案二:

解决方案三:

析构要在main函数退出的时候 所以你看不到输出了 可以放到一个函数中用B做局部变量

解决方案四:

创建B对象时,先执行基类A的构造函数,再执行派生类B的构造函数,释放时,先执行派生类B的析构函数,再执行基类A的析构函数

解决方案五:

解决方案六:

首先调用构造函数是两种,一种是像定义普通类型一样(int n;),另一种是new申请分配空间(new)

 B b;
 B*  pB = new B();

这两种方式都是自动调用构造函数实例化对象B。

 B* pB;//注意这种形式是实例化对象的,只是定义了这个类类型的指针而已 B* pB = 0;一般这么用,以后你会明白

解决方案七:

他们中给你的例子可以看一下,为什么有些是没有调用析构呢,因为析构函数是在对象作用域之外才会自动调用,
注意看我楼上和其他人的区别,因为那个对象定义在一个函数中,函数调用过之后就到了定义对象就到了作用域
之外了,所以自动调用了。
你有两种方式调用析构,手动调用这个析构函数,一般使用中是new然后delete

解决方案八:

你的B out(); 编译器把它编译成声明一个返回值为B的函数了, 如果要定义对象不加()

解决方案九:

把你的B Out(); 放在{}里面

main()
{
{//写在之里面!
B ot();
}

system("pause");

}

解决方案十:

#if 1
#include
using namespace std;

class A
{
public:
A(){ cout << "Build A" << endl; }
~A(){ cout << "Destroy A" << endl; }
};
class B :public A
{
public:
B() :A(){ cout << "Build B" << endl; }
~B(){ cout << "Destroy B" << endl; }
};

int main()
{
//B Out(); //你不能这样定义B类型的对象,这样子编译器会认为他是函数并且以函数的方式去处理...
B Out; //这才是正确的定义
return 0;
}
#endif

时间: 2024-09-19 09:09:37

c++-请问C++析构函数的问题。的相关文章

析构函数的奥秘

请看如下一段代码: class A { public: A () { pValue = new int[100]; printf("Constructor of A\n"); } ~A () { delete [] pValue; printf("Deconstructor of A\n"); } private: int * pValue; }; class B { public: ~B () { printf("Deconstructor of B\n

指针-C++中请问如何实现delete this以后置零的需求。

问题描述 C++中请问如何实现delete this以后置零的需求. 因为源代码中有大量的delete this,会造成很多意想不到的问题,所以我希望把结构改为如下代码,将delete this改为killMe.有大神能帮忙看看下面的代码有什么问题吗?走到killme中的delete me;的时候,它不进析构函数.然后if(0 != m)该判断始终不为0,于是会造成再次调用Do();,导致程序崩溃.谢谢! #include ""stdafx.h""#include

mfc-MFC CArray使用自定义类型时不能指定析构函数?

问题描述 MFC CArray使用自定义类型时不能指定析构函数? 如果使用的自定义类不含指针成员,就没什么问题,另外我发现使用MFC的CList也会出现同样的崩溃.请问错在哪 解决方案 MFC中动态数组CArray的使用 解决方案二: 用模版库的std list试试

div布局-请问怎么让div中的div在垂直方向上居中呢?

问题描述 请问怎么让div中的div在垂直方向上居中呢? 比如:下面这段代码,如何让里面的div在垂直方向上面居中呢(不好意思,实在是没有悬赏币了) .out{ width:500px; height:500px; background:blue;}.inn{ width:200px; height:200px; background:red;} 解决方案 你的inn怎么比out还大..搞反了吧..通过margin来定位.absolute定位最好,不需要考虑父容器,只需要依据自身的宽和高度来调整

请问下有谁调用过银联代付的接口

问题描述 请问下有谁调用过银联代付的接口 有前辈在吗,我可以贴代码,访问接口,返回值表示参数错误,我可以贴代码 解决方案 如果用java的话,可以参考以下链接的几个文件看看 http://www.chendw.cn/original/205.html 解决方案二: 贴出来吧哥们. 我也想知道

新人一枚,请问怎样从B线程调用A线程的内容?

问题描述 新人一枚,请问怎样从B线程调用A线程的内容? 具体要求:写一个线程A,得到0-10的随机数,再写一个线程B来了调用线程A!!!!! 解决方案 int a;//全局变量,如果多个线程同步访问需要加锁 A...//线程A B...//线程B 代码结构大致如上,访问的时候,因为变量a是全局数据,所以在线程A和B中都可以直接访问,就好像C中的任何函数都可以访问和使用全局变量一样 解决方案二: 放是全局变量来交换数据

理解finalize()-析构函数替代者

函数 理解finalize()-析构函数替代者   在许多方面,Java 类似于 C++.Java 的语法非常类似于 C++,Java 有类.方法和数据成员:Java 的类有构造函数: Java 有异常处理.       但是,如果你使用过 C++ 会发现 Java 也丢掉一些可能是你熟悉的特性.这些特性之一就是析构函数.取代使用析构函数,Java 支持finalize() 方法.       在本文中,我们将描述 finalize() 与 C++ 析构函数的区别.另外,我们将创建一个简单的 A

link环境下制作一款《订餐软件》,请问延迟发货的定时器和定时发货的定时器的区隔怎么实现?

问题描述 link环境下制作一款<订餐软件>,请问延迟发货的定时器和定时发货的定时器的区隔怎么实现? link环境下制作一款<订餐软件>,请问延迟发货的定时器和定时发货的定时器的区隔怎么实现? 解决方案 这个可以使用quartz.net http://blog.csdn.net/gavin_luo/article/details/12758973

link环境下制作一款《订餐软件》,请问定时发货的实现,如何多个定时器编程?

问题描述 link环境下制作一款<订餐软件>,请问定时发货的实现,如何多个定时器编程? link环境下制作一款<订餐软件>,请问定时发货的实现,如何多个定时器编程? 解决方案 这个可以使用quartz.net http://blog.csdn.net/gavin_luo/article/details/12758973