1.构造函数执行顺序:基类(按声明顺序)->内嵌成员(按声明顺序)->本类,
析构函数与之严格相反:本类->内嵌成员(按声明顺序反序)->基类(按声明顺序反序)
2.虚析构函数:
虚析构函数在把子类new一个赋给父类指针时,delete这个指针时,调用的是子类的析构函数(子类的析构函数会调用父类的析构函数)
3.父类指针强转成子类指针后,如果是在栈上,不会调用子类的析构函数,如果在堆上,delete子类会调用子类的析构函数
#include "stdafx.h"
class A
{
public:
~A(){printf("a");};
};
class B:public A
{
public:
~B(){printf("b");};
};
void fun()
{
A a;
B *b = (B *)&a;
}
int _tmain(int argc, _TCHAR* argv[])
{
fun();
getchar();
return 0;
}
打印'a'
#include "stdafx.h"
class A
{
public:
~A(){printf("a");};
};
class B:public A
{
public:
~B(){printf("b");};
};
void fun()
{
A *a = new A;
B *b = (B *)a;
delete a;
}
int _tmain(int argc, _TCHAR* argv[])
{
fun();
getchar();
return 0;
}
打印'a'
#include "stdafx.h"
class A
{
public:
~A(){printf("a");};
};
class B:public A
{
public:
~B(){printf("b");};
};
void fun()
{
A *a = new A;
B *b = (B *)a;
delete b;
}
int _tmain(int argc, _TCHAR* argv[])
{
fun();
getchar();
return 0;
}
打印'ab'
4.HANDLE者指针的区别在于,前者不能直接取得对象,必须调用API函数,在API函数里处理它指向的对象,这样就保证了安全性。
5.WIN32的核心对象:
1.线程
2.进程
3.文件
4.事件(events)
6.信号量(semaphores)
7.互斥器(mutexes)
8.管道(Pipes,分为named和anonymous两种)
6.核心对象和GDI对象(HPEN,HBRUSH等)都是用句柄标示的,
不同:
1.核心对象是由KERNEL32.DLL,GDI对象是GDI32.DLL管理的
2.核心对象的句柄都是HANDLE,不同GDI对象对象句柄名不同
3.核心对象可以跨进程。