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;/
}
用这两个宏