1、当一个类包含了纯虚函数,这个类就不能用来创建对象了。这个类叫做抽象类。 2、当一个类继承了父类的话,必须去重写父类的纯虚函数。如果子类不重写父类的纯虚函数,子类仍然是抽象类。 3、纯虚函数的实现: classAnimal {public:virtualvoidspeak() =0;//纯虚函数}; 虚析构函数以及纯虚析构函数: 1、...
虚函数和普通成员函数的区别,是虚函数放在虚函数表中,通过对象的this指针找到该类的虚函数表,然后调用。C++即采用此机制实现多态。如果是普通函数,每个函数的地址是死的。所以用A类的对象调用析构函数时只能调到A的析构。如果是虚函数,则会通过指针找到B的析构函数,而B继承自A,还会调用A的析构函数。因此,虚析...
virtual void foo()=0; // =0标志一个虚函数为纯虚函数 }; 一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。 2.3 虚析构函数 析构函数也可以是虚的,甚至是纯虚的。例如: cl...
虚析构的实现与虚函数一致,只需要在父类的析构函数前面加上关键字即可,只需要将前面代码中的Animal基类改成: 此时运行结果为: 可以看到此时的Cat正常析构,堆区数据被正常释放! 纯虚析构 与纯虚函数实现类似,将Animal基类做如下改动: 值得注意的是,纯虚析构必须在类外具体实现,否则将无法完成编译。拥有纯虚析...
在main函数中new出来的是子类son的对象,采用一个父类father的指针来接收,故在析构的时候,编译器因为只知道这个指针是父类的,所以只将父类部分的内存析构了,而不会去析构子类的内存,就造成了内存泄露,那么如何避免这种情况的产生呢? 将父类的析构函数改为虚函数,就可以避免这种情况。
多态,简单来讲,就是父类定义了虚函数,子类重新实现该函数,那么当父类指针指向子类时,会调用子类的该方法,这,就是多态。 子类和父类调用构造函数和析构函数的先后顺序 子类对象定义时,先调用父类的构造函数,再调用子类的构造函数; 子类对象销毁时,先调用子类的析构函数,再调用父类的析构函数。
析构函数的属性: 销毁对象时,将自动调用析构函数。 不能将其声明为static或const。 析构函数没有参数。 它没有返回类型,甚至没有空。 具有析构函数的类的对象不能成为联合的成员。 析构函数应在该类的公共部分中声明。 程序员无法访问析构函数的地址。
C中,内存分为5个区:堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量)和常量存储区(常量)。此外,C++中有自由存储区(new)一说。 全局变量、static变量会初始化为缺省值,而堆和栈上的变量是随机的,不确定的。
C++中的析构函数(Destructor) 点击打开在线编译器,边学边练 除了上一节讲到的类对象在创建时自动调用的构造函数,在对象销毁时也会自动调用一个函数,它也和类名同名,也没有返回值,名字前有一个波浪线~,用来区分构造函数,它的作用主要是用做对象释放后的清理善后工作。它就是析构函数。
main函数中new出来的是子类son的对象,采用一个父类father的指针来接收,故在析构的时候,编译器因为只知道这个指针是父类的,所以只将父类部分的内存析构了,而不会去析构子类的内存,就造成了内存泄露,那么如何避免这种情况的产生呢? 将父类的析构函数改为虚函数,就可以避免这种情况。