首页 > 应用开发 > IT综合 > 读书笔记:11章什么时间不适合使用虚函数2
11-2-3 不是所有的类都是通用的
类的接口由公有成员组成,类的实现由其他东西组成。而接口是一种与用户交流的方式。类可是有两种用户:使用该类对象的人和从这个类派生类的人。
如果我花时间考虑他人将如何扩展这个类的话,就会占用本来应该花在其他设计上的时间。
11-3 析构函数很特殊
当使用一个基类指针或引用来指向或者引用一个派生类对象时。虚函数。
class Base {
public:
void f();
virtual void g();
};
class Derived: public Base {
public:
void f();
virtual void g();
};
Base b;
Derived d;
Base* bp = &b;
Base* bq = &d;
Derived* dp = &d;
这里,bp指向一个Base对象,bq和dp指向Derived对象。如果我们用这些指针调用成员函数f和g会出现什么情况呢?
bp->f(); /* Base::f / bp->g(); /* Base::g */
bq->f(); /* Base::f / bq->g(); /*Derived::g */
dp->g(); /*Derived::g / dp->f(); /*Derived::f */
当下面两件事情同时发生时就要用虚析构函数了:
有需要析构函数的事情发生
他发生在这样一种上下文中:指向一个基类的指针或者引用都有一个静态类型,并且实际上都指向一个派生类的对象。
Base* bp;
Derived* dp;
bp = new Derived;
dp = new Derived;
delete bp; //Base 必须有一个虚析构函数
delete dp; //
我们这里用一个基类指针删除一个派生类对象。
另外,如果一个类的基类有一个虚析构函数,那么这个类也自动获得一个虚析构函数。
11-4 小结
三个原因不用:有时很大消耗;不总是提供所需的行为;有时我们写一个类时,不考虑派生问题。
必须使用:当你想删除一个表面指向基类对象,实际却是指向派生类对象的指针时。
写程序时我们必须考虑自己正在做什么,仅仅根据规则和习惯思维是不够的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/409557/viewspace-892343/ ,如需转载,请注明出处,否则将追究法律责任。