以前学的知识点,很容易忘,今天稍微整理一下
多态性(polymorphism)
多种形态。
继承(inheritance)
通过继承我们能够定义这样的类,它们对类型之间的关系建模,共享公共的东西,仅仅特化本质上不同的东西。派生类(Derived class)能够继承基类(base class)定义的成员,派生类可以无须改变而使用那些鱼派生类具体特性不相关的操作,派生类可以重定义那些与派生类型相关的成员函数,将函数特化,考虑派生类型的特性(使用虚函数)。最后,除了从基类继承的成员之外,派生类还可以定义更多的成员。
在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。
class中的定义的成员默认是private的,使用class保留字定义的派生类默认具有private继承;struct中定义的成员默认是public的,使用struct保留字定义的类默认具有public继承。
友元关系不能继承。基类的友元对派生类的成员没有特殊访问权限。
如果基类定义了static成员,则整个继承层次中只有一个这样的成员无论从基类派生出多少个派生类,每个static成员只有一个实例。
类的作用域
1)名字查找发生在编译时期;
2)与基类成员同名的派生类成员将屏蔽对基类成员的直接访问。派生类中定义的函数不重载基类中定义的成员。
构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员。析构函数的工作与构造函数和复制控制成员不同,派生类析构函数不负责撤销基类对象成员。编译器总是显示调用派生类对象基类部分的析构函数。每个析构函数只负责清除自己的成员。(考虑定义虚析构函数)
含有(或继承)一个或多个纯虚函数(pure virtual)的类是抽象基类(abstract base class)。
#include <iostream> using namespace std; #pragma once class MyBase { public: MyBase(void); ~MyBase(void); public: void ShowCountry(); void ShowCity(); virtual void ShowName(); virtual void ShowWords(); };
MyBase::MyBase(void) { } MyBase::~MyBase(void) { } void MyBase::ShowName() { cout << "Name:Base class" << endl; } void MyBase::ShowCountry() { cout << "Country:China" << endl; } void MyBase::ShowCity() { cout << "City:WuHan" << endl; } void MyBase::ShowWords() { cout << "Things can only get better," << endl; }
#include "mybase.h" class MyDerive : public MyBase { public: MyDerive(void); ~MyDerive(void); void ShowCity(); virtual void ShowName(); virtual void ShowWords(); };
#include "MyDerive.h" MyDerive::MyDerive(void) { } MyDerive::~MyDerive(void) { } void MyDerive::ShowName() { cout << "Name:Derived class" << endl; } void MyDerive::ShowCity() { cout << "City:HuangGang" << endl; } void MyDerive::ShowWords() { MyBase::ShowWords(); // 调用基类版本 cout << "So try to make it beautiful!" << endl; }
#pragma once class MyAbstract { public: MyAbstract(void); ~MyAbstract(void); virtual void ShowName() = 0; // 纯虚函数 };
#include "MyAbstract.h" MyAbstract::MyAbstract(void) { } MyAbstract::~MyAbstract(void) { }
#include <iostream> #include "MyBase.h" #include "MyDerive.h" int main() { MyBase *pmb = new MyBase(); MyDerive *pmd = new MyDerive(); pmb->ShowName(); pmb->ShowCountry(); pmb->ShowCity(); cout << endl; pmd->ShowName(); pmd->ShowWords(); pmd->ShowCountry(); // 调用派生类的基类部分 pmd->ShowCity(); // 屏蔽基类成员函数 cout << endl; pmb = pmd; pmb->ShowName(); // 运行时确定Virtual函数的调用(MyDerive) pmb->ShowCity(); // 编译时确定非Virtual函数的调用(MyBase) WuHan system("pause"); return 0; }