了解虚析构函数的例子

‘init‘:member function definition looks like a ctor(构造函数的缩写)
具体编译的错误提示如下:
warning C4183: ‘init‘: member function definition looks like a ctor, but name does not match enclosing class
warning C4183: ‘method‘: member function definition looks like a ctor, but name does not match enclosing class
Linking...
main.exe - 0 error(s), 2 warning(s)
意思:成员函数像是一个构造函数ctor,但成员函数的名字又与类名不匹配
/////////////////////////////////////代码如下:
#include<iostream>
using namespace std;

class A
{
public:
 A(){ cout<<"A()"<<endl; init();}
    // ~A(){cout<<"~A()"<<endl;}
     virtual ~A(){cout<<"~A()"<<endl;}
 virtual init(){cout<<"A::init()"<<endl;}
 virtual method(){cout<<"A::method()"<<endl;}
};
class B:public A
{
public:
 B()
 {
  cout<<"B()"<<endl;
 }
 ~B(){cout<<"~B()"<<endl;}
 init(){cout<<"B::init()"<<endl;}
 method(){cout<<"B::method()"<<endl;}
};
int main()
{
 A* p;
 p=new B();
  p->method();
  delete p;//导致内存泄露
  return 0;
}
//从上面红色字体的成员函数可以看出,函数没有返回类型,也就像是写了一个析构函数,但是却没有和类名相匹配。
正确的代码如下:
#include<iostream>
using namespace std;

class A
{
public:
 A(){ cout<<"A()"<<endl; init();}
    // ~A(){cout<<"~A()"<<endl;}
    virtual  ~A(){cout<<"~A()"<<endl;}
 virtual void init(){cout<<"A::init()"<<endl;}
 virtual void method(){cout<<"A::method()"<<endl;}
};
class B:public A
{
public:
 B()
 {
  cout<<"B()"<<endl;
 }
 ~B(){cout<<"~B()"<<endl;}
    void init(){cout<<"B::init()"<<endl;}
 void method(){cout<<"B::method()"<<endl;}
};
int main()
{
 A* p;
 p=new B();
  p->method();
  delete p;//如果不删除对象指针,会导致内存泄露,无法调用析构函数
  return 0;
}
其中温习一个要点:虚析构函数的使用  
构造函数初始化程序(const变量的特殊优待(初始化列表)
在如下类定义中:
class C
{
public:
      C(){
     x=0;  // OK, x is not const
    c=0; //ERROR ,c is const
     }
private:
     int x;
    const int c;
};
类C的构造函数通过赋值语句对该类的两个数据成员进行初始化。但由于数据成员c是const类型的,因此对其做出的赋值操作是非法的。只要为构造函数添加一个初始化列表(constructor initializer)就可以解决问题
修改后:
   C( ):c(0) {x=0;}
结论:初始化const类型数据成员的唯一方法:初始化表。

时间: 2024-10-17 21:18:25

了解虚析构函数的例子的相关文章

C++虚析构函数

在类中,构造函数用于初始化对象及相关操作,构造函数是不能声明为虚函数的,因为在执行构造函数前对象尚未完成创建,虚函数表尚不存在,此时就无法去查询虚函数表,因此也就无法得知该调用哪一个构造函数了. 析构函数则用于销毁对象时完成相应的资源释放工作,析构函数可以被声明为虚函数.我们先通过一个例子来说明析构函数声明为虚函数的必要性. 例1: #include<iostream>using namespace std; class base{public: base(); ~base();private

虚析构函数(√)、纯虚析构函数(√)、虚构造函数(X)

from:http://blog.csdn.net/fisher_jiang/article/details/2477577 一. 虚析构函数 我们知道,为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数.因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数. 如: class Base{public:   Base(){}   virtual ~Base(){}};class Derived: public Base{public:   D

C++中的虚析构函数、纯虚析构函数详解

C++中析构函数可以为纯虚函数吗? 众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用.那么析构函数是否可以设为纯虚呢? class CBase { public: CBase() { printf("CBase()\n"); } virtual ~CBase() = 0; // 析构函数是纯虚函数 }; 答案是可以,那么这样实现的目的是什么呢?当然是避免实例化. 但因为派生类不可能来实现基类的析构函数,所以基类析构函数虽然

C++虚函数表与虚析构函数

1.静态联编和动态联编联编:将源代码中的函数调用解释为要执行函数代码. 静态联编:编译时能确定唯一函数.在C中,每个函数名都能确定唯一的函数代码.在C++中,因为有函数重载,编译器须根据函数名,参数才能确定唯一的函数代码. 动态联编:编译时不能确定调用的函数代码,运行时才能.C++中因为多态的存在,有时编译器不知道用户将选择哪种类型的对象,因此无法确定调用的唯一性,只有在运行时才能确定. 2.虚成员函数,指针或引用,动态联编指针或引用才能展现类的多态性.当类中的方法声明为virtual时,使用指

C++ Primer 学习笔记33_面向对象编程(4)--虚函数与多态(一):多态、派生类重定义、虚函数的访问、 . 和-&gt;的区别、虚析构函数、object slicing与虚函数

C++ Primer学习笔记33_面向对象编程(4)--虚函数与多态(一):多态.派生类重定义.虚函数的访问. . 和->的区别.虚析构函数.object slicing与虚函数 一.多态 多态可以简单地概括为"一个接口,多种方法",前面讲过的重载就是一种简单的多态,一个函数名(调用接口)对应着几个不同的函数原型(方法). 更通俗的说,多态行是指同一个操作作用于不同的对象就会产生不同的响应.或者说,多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为. 多态行分

C++学习24 虚析构函数

在C++中,构造函数用于在创建对象时进行初始化工作,不能声明为虚函数.因为在执行构造函数前对象尚未创建完成,虚函数表尚不存在,也没有指向虚函数表的指针,所以此时无法查询虚函数表,也就不知道要调用哪一个构造函数.下节会讲解虚函数表的概念. 析构函数则用于在销毁对象时完成相应的资源释放工作,可以被声明为虚函数. 为了说明虚析构函数的必要性,请大家先看下面一个例子: #include <iostream> using namespace std; //基类 class Base{ private:

静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #include<iostream> void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void

第六篇:为多态基类声明虚析构函数

前言 在很多类中,可以看到其析构函数都是声明为虚函数的. 那么,为何要将析构函数声明为虚函数?哪些情况要将析构函数声明为虚函数? 本文将为你解惑. 在使用 C++ 实现多态的时候,有一点一定要清楚:当派生类对象经由基类指针被删除,而此基类的析构函数没有被声明为虚函数的话,那么析构函数只会释放基类部分的成员而无视派生类成员. 如果不对这一点加以防范,那么很多时候,会带来内存泄露这样灾难性的后果. 问题描述 假设,有以下几个类,分别代表:钟,原子钟,水钟,腕表: 1 // 钟 2 class Tim

条款7:为多态的基类声明虚析构函数。

任何的类只要带有一个virtual函数那么就集合可以确定其应该有一个virtual析构函数. 同样的如果一个函数不含有virtual函数,那么通常意味着其不是一个基类函数,而且为一个不是基类的类声明virtual的析构函数是十分糟糕的事情,不要这样做.具体原因在下面: 1.首先,想要实现出virtual函数,对象必须要携带某些信息,.信息通过vptr来实现,这个vptr指向一个由函数指针构成的数组,即vtbl.盲目的去使用虚函数就会使得浪费资源.(一般人的经验是,只有当函数需要使用一个虚函数的时