1) 派生类到基类转换的可访问性
摘自: http://topic.csdn.net/u/20090914/15/34366e2d-0cd6-4ded-8970-70d85a8a2e9b.html
1.如果是 public 继承,则用户代码和后代类都可以使用派生类到基类的转换。 2.如果类是使用 private 或 protected 继承派生的,则用户代码不能将派生类型对象转换为基类对象。 3.如果是 private 继承,则从 private 继承类派生的类不能转换为基类。 4.如果是 protected 继承,则后续派生类的成员可以转换为基类类型。 5.无论是什么派生访问标号,派生类本身都可以访问基类的 public 成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。
例子:
class c00 { private: int c00a; }; class c10 : public c00 { private: int c10a; public: void f(const c00 & c) //1 ok { } }; class c11 : protected c00 { private: int c11a; public: void f(const c00 & c) //5 ok { } }; class c12 : private c00 { private: int c12a; public: void f(const c00 & c) //5 ok { } }; class c21 : public c11 { private: int c21a; public: void f(const c00 & c) //4 ok { } }; class c22 : public c12 { private: int c22a; public: void f(const c00 & c) //3 error { } }; void f(const c00 & c) { } void main() { c10 t10; c11 t11; c12 t12; f(t10); //1 ok f(t11); //2 error f(t12); //2 error }
1) 调用顺序
基类默认构造函数->子类构造函数
2) 子类只能调用直接基类的构造函数
3) 如果一个类定义了自己的结构,与该类对象所有的交互都应该通过该接口
4) 例子
class Base{};
class Derived : public Base
{
public:
Derived (const Derived &b):Base(b){}
Derived& operator=(const Derived &rhs)
{
if(this!=&rhs)
{
Base::operator=(rhs);
}
}
};
multiset<Base> base;
Derived derived;
base.insert(derived);//插入的时候会削去后加的部分,与直接赋值差不多
摘自http://baike.baidu.com/view/3524479.htm
句柄类实际上通过复制指向引用计数器类型的指针,来代替复制实际对象;从而使得复制对象变成复制指针,实现虚拟复制(即是用复制对象的地址代替复制对象本身),以提高内存效率和访问速度。在涉及到大型、复杂对象以及一些不能复制或是不易复制的对象的复制控制问题时,显得特别有用。
比如2个射线共用一个定点,这个定点如果使用句柄类就可以只初始化一个实例就行了.两个射线分享的是这个定点的智能指针,或者说是句柄.