虚析构函数的作用(1.基类为什么需要虚析构函数)
本文目录
1.基类为什么需要虚析构函数
基类虚析构,是为了在多态中,能正确调用到对应的析构函数。例如:class A{ public:virtual ~A();}class B: public A{public:~B();}具体实现略去,只看继承关系,那么当我有如下代码:A* p = new B();delete p;此时如果不是虚析构函数,则只会调用到A的析构函数,而不会调用B的析构函数,这样会产生一系列的问题。只有虚析构函数,才能确保调用到正确的函数(B的析构)。
C++中虚函数的作用是什么定义是什么简要说明下,并举一个简单的例子
作用:虚函数的作用就是将接口(函数调用)与实现(函数定义)分开, 就是实现所谓的多态行为。也就是说虚函数提供了让你修改基类函数定义的机会。这里虽然你定义了一个派生类但是这个派生类任然可以按照基类的方式使用,即将派生类对象传递给需要基类引用、指针的函数。
定义: 在一个类中,一个由virtual 关键字修饰的函数声明表示这个函数声明所对应的函数调用既要服务于本类中的函数定义也要服务于派生类中的函数定义,相当于一个接口的作用。
一段良好的代码通常只使用基类提供的接口来编写,那些与派生类相关的代码单独放在一个地方(工厂)。
例子:
class Window { public: virtual void drawEvent(void *event); / virtual void keyEvent(void *event); virtual void mouseEvent(void *event); virtual void addWindow(Window *window); void show(); virtual ~Window(); // 用到继承, 基类的析构函数必须声明为虚函数,否则是逻辑错误 ... }; class Button : public Window { public: // 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为 void drawEvent(void *event); void keyEvent(void *event); void mouseEvent(void *event); void setText(const std::string label); .... }; class Menu; class MenuBar : public Window { public: // 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为 void drawEvent(void *event); void mouseEvent(void *event); void addWindow(Window *m); ... }; class Menu : public Window { public: // 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为 void drawEvent(void *event); void mouseEvent(void *event); void keyEvent(void *event); }; void userCode(Window &win, Window &win2) { win.addWindow(win2); //用户代码只用到了基类的引用 } int main() { Window mainWindow(...); MenuBar menuar(...); Menu fileMenu(...); Button button(...); usrCode(mainWindow, menuBar); //将MenuBar对象当做Window引用来使用,由于定义了虚函数,所以usrCode会使用我们重定义的代码 usrCode(menuBar, fileMenu); //... usrCode(mainWindow, button); //... mainWindow.show();}
析构函数和虚函数的用法及作用!
析构函数是用来释放所定义的对象中使用的指针,默认的析构函数不用显示调用,自建的析构函数要在程序末尾调用。虚函数可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,而不是基类中定义的成员函数(只要派生类改写了该成员函数)。若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都会调用基类中定义的那个函数。
请讲一讲析构函数和虚函数的用法和作用
【答案】:析构就是对象离开生存空间时执行的,用来清理分配的空间之类.虚函数的作用:假如有类A.类A派生出类B.那么如果写A* p = new B;时.就得到了一个指向类B的指针,这个指针的类型是A*如果类A和类B中都有void Out()这么个函数.p-》Out()将调用A::Out()函数而如果把类A中的改成虚函数virtual void Out().p-》Out()就将调用B::Out()函数
更多文章:
excel中index函数的用法(Excel中INDEX函数怎么使用)
2024年6月24日 10:25
router是什么意思(vue的$route和$router有什么区别和关系呢)
2024年6月27日 17:14
jdbc的作用(在java中JDBC的主要作用是什么和他的组成有哪些)
2024年7月4日 06:29
android系统签名怎么查看(Android怎样获取应用的签名信息)
2024年5月26日 13:05
script hook rdr2(请问谁知道哪里有远程控制软件VNC的源码)
2024年7月16日 06:04
正则匹配两个汉字(正则表达式在一段文本中匹配到包含的两个汉字的某一行)
2024年7月7日 18:50
php判断数据库是否连接成功(php pdo连接mysql如何判断数据库是否连接成功)
2024年7月8日 13:31
cluster的同义词(有人能不能告诉我 crowd , cluster和throng 这三个单词的区别啊)
2024年7月29日 15:10
php学校新闻管理系统代码(用php制作新闻页面的后台管理系统怎么设计.急用!!!)
2024年8月23日 16:50