深入剖析C++继承,多态以及隐藏(三)(类层次中的转化问题)
2008-11-21 12:33
477 查看
一,C++几个特殊函数;
1,在定义一个类的时候,如果程序员没有显示的定义一下几个东西的话,编译器会自动为你生成以下的几个成员;
1)缺省构造函数.(无参)
2)拷贝构造函数
3)赋值运算符.
4)取地址运算。
5)析构函数
也就是说你定义一个class Empty(){};
跟你定义一个
class Empty{
public:
Empty(); // 缺省构造函数
Empty(const Empty& rhs); // 拷贝构造函数
~Empty(); // 析构函数 ---- 是否
// 为虚函数看下文说明
Empty&
operator=(const Empty& rhs); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const;
};
是一样的。
2,这样也就决定了几个问题:
1)在继承的过程中,构造函数,析构函数,赋值运算符,拷贝构造函数不会被继承。
2)如果在派生类中没有显示的定义,编译器会为你做初始的定义!
二,类层次中的向上向下类型转化;
1,层次中对指针或者是引用进行类型的向上转化是安全的也不需要显示的转化,这也是虚函数实现动态的一个方法!
2,层次中如果使用对象来直接进行类型的向上转化的话,那么将会发生"对象切片"的问题。
也就是说最后转化后的对象只保留上一个层次中所能拥有的接口!
3,层次中向下类型转化,是不确定也不是安全的。也是需要显示才能作出转化的。通常的话有两种转化方式,一种是
dynamic_cast<Derived*>(base*);
另外一种是静态的转化: static_cast<Derived* >(base*);
显然静态的转化所需要的空间以及系统资源较少,但是动态的较多;
所以在可以确定转化的类型的时候,可以配合RTTI(run-time-type-information)来使用静态转化。
当然如果不知道确定类型的话,更为安全的用法当然是动态转化!
三,杂七杂八;
1,new和delete的配对使用。
其中的配对使用不仅仅说明了有多少个new操作就必须做多少个delete操作;这个对于先学习java语言或者是c#语言而后来学C++语言的人是特别要
注意的!
千万不能忘记delete。否则memory leak就会不知不觉的发生!
2,其次new和delete的形式必须相同!
也就是说new的是个指针指向的是单一对象还是[]指向数组;
那么delete也必须相对应的delete相应的内容!(加还是不加[])
1,在定义一个类的时候,如果程序员没有显示的定义一下几个东西的话,编译器会自动为你生成以下的几个成员;
1)缺省构造函数.(无参)
2)拷贝构造函数
3)赋值运算符.
4)取地址运算。
5)析构函数
也就是说你定义一个class Empty(){};
跟你定义一个
class Empty{
public:
Empty(); // 缺省构造函数
Empty(const Empty& rhs); // 拷贝构造函数
~Empty(); // 析构函数 ---- 是否
// 为虚函数看下文说明
Empty&
operator=(const Empty& rhs); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const;
};
是一样的。
2,这样也就决定了几个问题:
1)在继承的过程中,构造函数,析构函数,赋值运算符,拷贝构造函数不会被继承。
2)如果在派生类中没有显示的定义,编译器会为你做初始的定义!
二,类层次中的向上向下类型转化;
1,层次中对指针或者是引用进行类型的向上转化是安全的也不需要显示的转化,这也是虚函数实现动态的一个方法!
2,层次中如果使用对象来直接进行类型的向上转化的话,那么将会发生"对象切片"的问题。
也就是说最后转化后的对象只保留上一个层次中所能拥有的接口!
3,层次中向下类型转化,是不确定也不是安全的。也是需要显示才能作出转化的。通常的话有两种转化方式,一种是
dynamic_cast<Derived*>(base*);
另外一种是静态的转化: static_cast<Derived* >(base*);
显然静态的转化所需要的空间以及系统资源较少,但是动态的较多;
所以在可以确定转化的类型的时候,可以配合RTTI(run-time-type-information)来使用静态转化。
当然如果不知道确定类型的话,更为安全的用法当然是动态转化!
三,杂七杂八;
1,new和delete的配对使用。
其中的配对使用不仅仅说明了有多少个new操作就必须做多少个delete操作;这个对于先学习java语言或者是c#语言而后来学C++语言的人是特别要
注意的!
千万不能忘记delete。否则memory leak就会不知不觉的发生!
2,其次new和delete的形式必须相同!
也就是说new的是个指针指向的是单一对象还是[]指向数组;
那么delete也必须相对应的delete相应的内容!(加还是不加[])
相关文章推荐
- 深入剖析C++继承,多态以及隐藏(三)(类层次中的转化问题)
- 深入剖析C++继承,多态以及隐藏(二)。(纯虚函数以及重写与隐藏)
- 深入剖析C++继承,多态以及隐藏(二)。(纯虚函数以及重写与隐藏)
- 深入剖析C++继承,多态以及隐藏(一)。(虚函数探究)
- C++多态之继承6-派生类中增加功能,重定义功能,添加功能以及隐藏功能
- C++三大特性之多态(二)---深度剖析各种虚继承虚函数以及虚表的内容存放
- 关于c++中的public继承,private继承,以及protect继承的问题
- C++中的【菱形虚继承】深入剖析
- 深入剖析ThreadLocal实现原理以及内存泄漏问题
- [转]C++中的【菱形虚继承】深入剖析
- JVM--深入剖析继承与多态实现原理(合集篇)
- java中静态属性和和静态方法的继承问题以及多态的实质
- C++继承与多态问题
- .NET中继承和多态深入剖析(中)(转)
- 【c++】深入剖析虚拟继承与各种继承关系中派生类内成员内存分布情况及虚基类表的内容
- C++继承、虚函数、纯虚函数、多态、覆盖、重载、隐藏、引用等常用概念
- 深入剖析ThreadLocal实现原理以及内存泄漏问题
- 剖析java中的多态(继承)问题
- C++中的【菱形虚继承】深入剖析
- .NET中继承和多态深入剖析(上)(转)