现在的位置: 首页 > 综合 > 正文

C++随笔

2013年12月04日 ⁄ 综合 ⁄ 共 1401字 ⁄ 字号 评论关闭

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);

参考:函数里怎么传递二元数组参数9楼的答案

 

 

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)

 

抱歉!评论已关闭.