第十五章 面向对象编程(二)

    技术2024-11-05  27

     

    15.2 转换与继承

    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 }  

    15.3  构造函数和复制控制

    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);

    }

    }

    };

    15.7 容器与继承

    multiset<Base>  base;

    Derived derived;

    base.insert(derived);//插入的时候会削去后加的部分,与直接赋值差不多

    15.8 句柄类与继承

    摘自http://baike.baidu.com/view/3524479.htm

     

      句柄类实际上通过复制指向引用计数器类型的指针,来代替复制实际对象;从而使得复制对象变成复制指针,实现虚拟复制(即是用复制对象的地址代替复制对象本身),以提高内存效率和访问速度。在涉及到大型、复杂对象以及一些不能复制或是不易复制的对象的复制控制问题时,显得特别有用。

     

    比如2个射线共用一个定点,这个定点如果使用句柄类就可以只初始化一个实例就行了.两个射线分享的是这个定点的智能指针,或者说是句柄.

     

     

     

    最新回复(0)