C++随笔

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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GrimRaider

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值