huangfu Blog
Love Leanote!
Toggle navigation
huangfu Blog
主页
About Me
归档
标签
13简化指针/抽象类/虚析构
2017-02-23 22:24:51
126
0
0
tarena
#简化指针 使用typedif简化函数指针 > typedef void (*sighander_t)(int); // 函数指针重命名 ##操作指针调用虚表中的函数 #include <iostream> using namesapce std; class Animal { public: virtual void run() { cout << "run()" << endl; } virtual void fun() { cout << "fun()" << endl; } }; /* 把函数指针定义成FUN类型*/ typedef void (*FUN)(void); /* 虚表就是一个存放函数指针的数组*/ /* 把虚表定义成VTABKE类型*/ typedef FUN* VTABLE; int main() { Animal animal; /* 那么取到虚表地址就可以像数组一样通过这个地址调用函数了*/ /* *(&animal)就是虚表的地址*/ /* 为了编译通过&Animal需要做类型转换*/ VTABLE pv = *((VTABLE*)(&animal)); pv[0](); pv[1](); } #抽象类 ##概念 不能实例化的类叫抽象类,除此之外和正常类没有区别 ##如何实现? 只要在类中出现一个纯虚函数那么这个类就是抽象类 class A { public: /* 这就是纯虚函数*/ virtual void show() = 0; }; 如果一个类继承了抽象类,则这个类自动成为抽象类,`除非实现纯虚函数.` #include <iostream> using namespace std; class Animal { public: /* 定义了一个纯虚函数*/ virtual void show() = 0; }; class Dog:public Animal { public: // 如果没有定义 virtual void show() { } }; int main() { /* 因为类Animal有纯虚函数,所以不能实例化*/ //Animal animal; /* 如果子类没有重新定义该纯虚函数,则因为继承了纯虚函数也不能实例化*/ //Dog dog; /* 解决方法是在子类重新定义纯虚拟函数*/ Dog dog; } #虚析构 ##概念 加了virtual修饰的析构函数叫虚析构函数 ##作用 当父类对象的指针指向子类对象时,如果释放指针对应的内存,只会调用父类的析构函数,不会去调用子类的析构. 如果把父类对应的析构函数修改成虚析构,则会调用子类析构函数,而子类析构函数的调用必然触发父类析构的调用(这是编译器做的). ##虚析构的应用 当父类型中,有虚函数或父子类型中都有堆内存处理. ##举例 #include <iostream> using namespace std; class A { int* data; public: A(int size = 2) { cout << "A()" << endl; data = new int[size]; } virtual ~A() { cout << "~A()" << endl; delete[] data; } }; class B:public A { int* data; public: B() { cout << "B()" << endl; data = new int(); } ~B() { cout << "~B()" << endl; delete data; } }; int main() { A* pa = new B(); delete pa; }
上一篇:
14异常exception
下一篇:
12多态/类型识别(dynamic_cast 和 typeid)
0
赞
126 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册