这两天看了C++ FAq。

1:以前没有知道这个,全是public继承

//作为public的子类指针可以转化为基类指针,
//但是protected,private 继承的子类指针不能转化为基类指针。
//默认不加转化情况

class s1 {
};

class s2 : protected s1   //public s1  private s1
{
};

void f(s1* v)
{
  return;
};
void g(s2* c)
{
f(c);
}

int main(int argc, char* argv[])
{
        s2 *s;

        g(s);
};

 

2: 这个 象 那个常量定义,在构造函数中还不是常量,在析构中类似。

Q66:若基底类别的建构子呼叫一个虚拟函数,为什麽衍生类别覆盖掉的那个虚拟函
     数却不会被呼叫到?
 
在基底类别 Base 的建构子执行过程中,该物件还不是属於衍生 Derived 的,所以
如果 "Base::Base()" 呼叫了虚拟函数 "virt()",则 "Base::virt()" 会被呼叫,
即使真的有 "Derived::virt()"。
 
类似的道理,当 Base 的解构子执行时,该物件不再是个 Derived 了,所以当
Base::~Base() 呼叫 "virt()",则 "Base::virt()" 会被执行,而非覆盖後的版本
"Derived::virt()"。
 
当你想像到:如果 "Derived::virt()" 碰得到 Derived 类别的物件成员,会造成什
麽样的灾难,你很快就会看出这规则的明智之处。
 
================================
 
Q67:衍生类别的解构子应该外显地呼叫基底的解构子吗?
 
不要,绝对不要外显地呼叫解构子(「绝对不要」指的是「几乎完全不要」)。
 
衍生类别的解构子(不管你是否明显定义过)会“自动”去呼叫成员物件的、以及基
底类别之子物件的解构子。成员物件会以它们在类别中出现的相反顺序解构,接下来
是基底类别的子物件,以它们出现在类别基底列表的相反顺序解构之。
 
只有在极为特殊的情况下,你才应外显地呼叫解构子,像是:解构一个由「新放入的
new 运算子」配置的物件。

4:创建二维数组的宏,没有用过,都是用的vector简单搞定了


发信人: zswolf2000 (少年壮志不言愁), 信区: CPlusPlus      
标  题: [FAQ]如何用宏生成动态二维数组
发信站: BBS 水木清华站 (Sun Feb 16 22:07:45 2003), 站内

#define matrix_allocate(matrix, width, height, TYPE) {/
 matrix = new TYPE* [height];/
 for(int _i = 0; _i < height; _i++)/
  matrix[_i] = new TYPE[width];/
}
#define matrix_delete(matrix, width, height){/
 for(int _i = 0; _i < height; _i++)/
  delete [] matrix[_i];/
 delete [] matrix;/
 matrix = 0;/
}
用这两个宏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值