关于“C++面向对象高级编程上”第三次作业
组合与继承(类与类之间三大关系)
复合(composition)
复合表示has-a,表示一个类里含有另一个类的对象(A拥有B),也称包含关系。
template
class queue
{
...
protected:
deque c; //底层容器
public:
bool empty() const { return c.empty();}//下列函数完全利用c类的操作函数完成
size_type size() const { return c.size();}
reference front() { return c.front();}
reference back() { return c.back();}
};
复合关系下的构造和析构
构造:构造是由内而外,就像打包裹,从里往外。container的构造函数首先调用components的default构造函数,然后才执行自己。(红色部分是编译器自动完成的)
Container::Container(...):Component(){...};
析构:析构是由外而内,就像拆包裹,从外往里。Container的析构函数首先执行自己,然后才调用components的析构函数。
Container::~Container(){~Component();}
委托(delegation)composition by reference
委托:表示一个类里含有另一个类的指针或者引用对象。(生命不同,前面composition是一起创建一起结束,这里的delegation先创建string再等到需要时创建string)
class String
{
private:
StringRep* rep; //pimml handle and body 编译防火墙
};
编译防火墙:一个类提供接口,具体实现由另一个类来完成,两个类为委托关系,后一个类改变内容不影响前面(接口)。假如多个委托关系,A想改变内容,B、C共享以前的东西,(copy on write )给一个副本写。
继承(inheritance)
继承表示is-a,表示派生类对象也可以是一个基对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。(C++ primer plus) 小指向大,子类指向父类
struct _List_node_base
{
_List_node_base* _M_next;
_List_node_base* _M_prev;
};
template
struct _List_node
: public _List_node_base{_Tp _M_data;};
C++有三种继承方式:共有继承(使用最多)、保护继承、私有继承。(java只有共有继承)
继承关系下的构造和析构
构造:继承关系下的构造由内而外。Derived的构造函数首先调用Base的default构造函数,然后才执行自己。
析构:析构由外而内。Derived的析构函数首先执行自己,然后才调用Base的析构函数。
虚函数与多态
虚函数
任何成员函数前加上virtual后都称为虚函数
non-virtual函数:非虚函数,不希望这个函数子类重新定义(override,复习)它。
virtual函数:虚函数,你希望子类重新定义,而且父类中已经默认定义过这个函数。
pure virtual函数: 纯虚函数,你希望子类一定要重新定义且父类中并无默认定义。
例子如下:
class Shape
{
public:virtualvoid draw( ) const= 0; //纯虚函数virtualvoid error( const std::string& msg); //虚函数
int objectID( ) const; //非虚函数
...
};
class Rectangle: public Shape {...};
class Ellipse:public Shape{...};
Template Method
继承+复合关系下的构造和析构
构造由内而外
Derived的构造函数首先调用Base的default构造函数,然后调用component的default构造函数。
析构由外而内
Derived的析构函数首先执行自己,然后调用component的析构函数,然后调用Base的析构函数。