4.虚函数-多态
Posted smallqizhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.虚函数-多态相关的知识,希望对你有一定的参考价值。
1.多态
多态的条件:
(1):继承
(2):父类中有虚函数
(3):在子类中重新实现父类的虚函数(覆盖虚表)
(4):把子类对象/指针赋值给父类的引用/指针
(5):通过父类的引用/指针来调用虚函数(只能调用父类中存在的函数)
用C++类以及多态来封装pthread进程
class CppThread{ public: CppThread(){} ~CppThread(){} void start(); virtual void run(){} protected: pthread_t id; }; void *func(void *arg){ CppThread *cppth = (CppThread*)arg; while(1){ cout<<"____________start-----------"<<endl; cppth->run(); cout<<"____________end-----------"<<endl; } } void CppThread::start(){ //创建线程 pthread_create(&id, NULL, func, (void*)this); }
2.纯虚函数----->虚函数声明了,但是不实现。相当于接口函数,如果一个类中包含纯虚函数,那么这个类就是抽象类。
纯虚函数的定义:
class Base{ public: Base(){} ~Base(){} virtual void show() = 0;//纯虚函数 };
抽象类(接口类)的特点:
(1)抽象类不能创建对象
(2)如果基类中的纯虚函数在派生类中没有全部实现,那么派生类照样是抽象类。
虚析构:在多态的实现过程中,把子类的指针赋值为父类的指针,最后delete掉父类的指针,这个时候只会调用父类的析构函数,而不会自动调用子类的析构函数,如果把父类的析构函数设置成虚析构,那么delete的时候就会从子类的析构函数开始。
class Base{ public: Base(){}; virtual ~Base(){} virtual void show();//纯虚函数 } class Drived::Base{ public: Drived(){}; ~Drived(){} void show() } int main() { Base *b=new Drived();//子类的指针赋值为父类的指针 b->show(); delete b;//delete掉父类的指针 return b; }
3.static关键字
static修饰的特点:
(1):数据存储在数据段(局部全局)
(2)只分配一次空间(只初始化一次)
(3)修饰的变量或者函数只能在本文件中使用(文件作用域)
static在类中的使用:
修饰成员变量:
(1)static修饰的成员变量的空间不在对象空间中。
(2)static修饰的成员变量要在类外初始化(只初始化一次)。
(3)static修饰的成员变量是这个类的所有对象共有的。
(4)static修饰的公有成员变量是先于类对象而存在的,可以通过类名直接调用。
修饰成员函数:
(1)如果成员函数是公有成员函数,那么这个成员函数也是先于类对象而存在的,可以通过类名直接调用。
(2)静态成员函数不能使用非静态成员
4.const关键字
const在类中的使用:
修饰成员变量:在构造函数成员参数列表初始化
修饰成员函数:
(1)格式(声明和实现都需要用const修饰)
void info()const{}
(2)修饰的函数中不能修改成员变量,不能调用非const修饰的成员函数
修饰类对象:被修饰的对象的属性不能被修改,如果要调用成员函数只能调用被const修饰的成员函数。
PS:如果有哪里写错了,请指针,互相学习。
以上是关于4.虚函数-多态的主要内容,如果未能解决你的问题,请参考以下文章