您的位置:首页 > 编程语言

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

2011-02-07 19:00 183 查看

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个射线共用一个定点,这个定点如果使用句柄类就可以只初始化一个实例就行了.两个射线分享的是这个定点的智能指针,或者说是句柄.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: