2013-10-21
!类继承顺序
Class A1: public B, public C{};
Class A2: public C, public B{};
C* c1 = new A1();// 可以
A1* a1 = (A1*)c1;// 不可以,指针不正确
C* c2 = new A2();// 可以
A2* a2 = (A2*)c2;// 可以,指针正确
即使使用dynamic_cast也和隐式转换一样,指针不正确。
2013-10-29
virtual 修饰基类析构函数
例子1:没有virtual修饰的基类
Class BaseA
{
public:
BaseA();
~BaseA();
};
Class A: public BaseA
{
public:
A();
~A();
};
A* a = new A();// 构造BaseA,构造A
delete a;// 析构A,析构BaseA
BaseA* b = new A();//构造BaseA,构造A
delete b;// 析构BaseA,!!!注意这里没有析构A
A* c = new BaseA();// !!!编译错误
例子2:有virtaul修饰的基类
Class BaseB
{
public:
BaseB();
virtual ~BaseB();
};
Class B: public BaseB
{
public:
B();
~B();
};
B* a = new B();// 构造BaseB,构造B
delete a;// 析构B,析构BaseB
BaseB* b = new B();// 构造BaseB,构造B
delete b;// 析构B,析构BaseB
之前只记得加了virtual就可以将基类和派生类都析构,不加就只能析构派生类。后来一个同学说,不加virtual析构的时候基类和派生类也析构呀,并且写了个例子打印出来,我靠,还真是像他说的那样,难道是我记错了,不应该呀,后来经过详细的检查代码发现:delete派生类的指针时,无论有无virtual修饰基类析构函数,都会调用(例子1的a),但是当使用c++的多态特性的时候,也就是将派生类对象赋值给基类指针,再释放这个指针的时候就会出问题,他只执行了基类析构!原来是我自己没弄明白,感谢同学!
总结:
1. 调哪个析构函数是看释放的指针类型,
若是派生类,则两个都调用,
若是基类,无virtual则只调用基类析构,有virtual则两个都调用。
2. 对于普通成员函数覆盖之后,
无virtual,指针是啥就调用对应类的成员函数
有virtual,指针所指对象是啥类,就调用对应类的成员函数
3. object c无此特性,指针啥类型就调对应类函数(不是很确定,仅作参考)
4. java可以看成自动带virtual修饰(不是很确定,仅作参考)
20131103
函数的二元参数传递
char
(*board)[SIZE]
void function(char (*param)[4]){}
调用:
char srcStr[32][4];
function(srcStr);
20131103
std::map的使用
std::map<int, int> aaa;
aaa.clear();
if (aaa[3] != 8)// aaa[3]不存在于aaa中,自动创建了个值,默认0.相当于:aaa[3] = 0; 0 != 8
{
}
std::map<int, int>::iterator iter = aaa.find(3);
if (iter == m_aaa.end() || iter->second != 8)