关于“C++面向对象高级编程上”第三次作业

2017-07-27  本文已影响0人  hjsadam

组合与继承(类与类之间三大关系)

复合(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的析构函数。



上一篇下一篇

猜你喜欢

热点阅读