首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于析构和私有的有关问题

2012-02-07 
关于析构和私有的问题我有几个问题.比如一个向量vector base*vbase是一个基类,其中有许多子类,而子类是

关于析构和私有的问题
我有几个问题.比如一个向量
vector <base*>   v;
base是一个基类,其中有许多子类,而子类是通过动态申请new构造来的.
这时,子类内如果定义析构函数,可不可以用delete   this来释放子类对象的空间呢?
如果没有定义析构,用delete   v[i]可以释放子类占用的空间吧?
如果要删除向量的其中一个元素,要怎么操作呢?我们教材上没有,比如我要删除v[i]这个元素,而不是释放这个元素指向的空间,应该怎么操作?
        另外一个问题,关于拷贝构造的,比如一个类
      class   p{
          int   a;
          public:
            p(p&   s){a=s.a};
}
为了简单,省略一些定义,我的问题是,在拷贝构造函数里边s.a可以被访问而赋值给另一个对象的a么?那些成员是私有的啊,不是不可以访问的么?请解释下原理.
最后一个问题:
        有一个抽象基类,基类中没有定义数据成员.而继承的子类定义了数据成员
这时,如果用基类的地址值(该地址其实是子类赋值给基类类型的)去访问子类的数据成员,假设数据成员是可以访问的,这样允许不?
编译会不会认为基类没有定义数据成员,而不去管其子类有没有数据成员,就直接报错呢?


[解决办法]
没有定义析构函数编译器会生成一个的,它生成的这个只调用它的数据成员的析构函数,编译器生成的析构函数不是虚函数,所以你没有定义析构函数的话默认 delete v[i] 是释放不了子类的。

基类定义了虚拟析构函数后不管子类怎么样都可以释放了,不管你定义的是空函数体的析构函数,或者根本没定义,或者定义了没申明为虚(没申明为虚编译器也会当虚的来处理),都可以的。

热点排行