C++学习笔记(七)
提示:本笔记是个人学习侯捷C++课程的总结笔记,欢迎来信指正批评!
提示:以下是本篇文章正文内容,下面案例可供参考
一、Composition(复合)
template <class T>
class queue{
……
protected:
deque<T> c;
public:
/*以下完全利用c的操作函数完成*/
bool empty() const{return c.empty();}
void pop() {c.pop_front();}
};
1.构造函数由内而外,Container的构造函数首先调用Component的default构造函数,然后才执行自己。
2.析构函数由外而内Container的析构函数首先执行自己,然后才调用Component的析构函数。
二、Delegation(委托)(composition by reference)
class StringRep;
class String{
public:
String();
String(const char* s);
……
private:
StringRep* rep; //pimpl
};
三、Inheritance(继承)
struct _List_node_base
{
_List_node_base* _M_next;
_List_node_base* _M_prev;
};
template<typename _Tp>
struct _List_node:public _List_node_base
{
_Tp _M_data;
};
1.构造由内而外,Derived的构造函数首先调用Base的default构造函数,然后才执行自己。
2.析构由外而内,Derived的析构函数首先执行自己,然后才调用Base的析构函数。
四、虚函数
1.non-virtua函数:你不希望derived class重新定义它。
2.virtual函数:你希望derived class重新定义它,且你对它有默认定义。
3.pure virtual 函数:你希望derived class重新定义它,你对它没有默认定义。
class Shape{
public:
virtual void draw() const=0; /*pure virtual*/
virtual void error(const std::string& msg); /*virtual*/
int objectID() const; /*non-virtual*/
……
};
class Rectangle:public Shape{……};
class Elipse:public Shape{……};
总结
1.复合类和继承类的构造函数都是首先调用Base的构造函数,析构函数都是先执行自己的析构函数,然后在调用Base的析构函数。
2.base class必须是virtual,否则会出现undefined behavior