这是一个很好的虚拟继承使用?

时间:2012-04-20 21:31:40

标签: c++ destructor copy-constructor assignment-operator virtual-inheritance

我想跟踪某些选定类的对象的删除,而类代码本身的更改很少。

我考虑过重delete运算符(全局),但是需要我的重载delete出现在所有编译单元中,这在我的情况下可能很麻烦。此外,如果创建了跟踪对象的数组,我将不得不重载delete[]运算符,但遗憾的是,没有标准的方法可以在该重载代码中知道数组的长度,以及有多少对象被销毁。我也可以重载new[]运算符并跟踪分配及其长度,但它看起来不是一个干净的解决方案,并且遇到delete[]运算符的相同问题,即它必须是每个编译单元都可以访问。

所以我接受了对目标类的轻微修改。我的想法是在目标类中“注入”监视类的析构函数,具有“虚拟”(可能是多个)继承。当然,目标类可能是另一个的子类,因此它看起来像是虚拟继承的工作。这是我到目前为止所提出的。

class track_death{

protected:

    struct someusefulness{} info;

    track_death(){}

    explicit track_death(const track_death& o){
        copy_info(o);
    }

    track_death& operator=(const track_death& o){
        copy_info(o);
        return *this;
    }

    void copy_info(const track_death& o){
        //manage the copy of info, which is not trivial.
    }

    ~track_death(){
        //death has happened!
    }

};

struct anyclass: virtual track_death{
    //wathever 1...
};

struct anysubclass: public anyclass, virtual track_death{
    //wathever 2...

    anysubclass(){}

    anysubclass(const anysubclass& copythis){
        //initialization...

        //the user MUST append this last
        copy_info(copythis);
    }

};

struct anysubsubclass: public anysubclass, virtual track_death{
    //wathever 3...

    anysubsubclass& operator=(const anysubsubclass& copythis){
        //initialization...

        //the user MUST append this last
        copy_info(copythis);
        return *this;
    }

};

我有两个问题。

这是虚拟继承的良好用法,并且使用virtual关键字将最后一个叶子留在继承树中是正确的(参见anysubsubclass定义,它没有派生类),与{{3相反}}?关键是我想尽可能少地打扰我是否要在anysubsubclass中添加未来的后验派生类,或者删除基数和基数之间的anysubclass。最后派生的课程。

二。正如您在我的代码中看到的,如果其中一个目标类具有operator=的重载,或者具有复制构造函数,那么operator=track_death的复制构造函数永远不会得到调用,这是一个问题,因为track_death包含一个无法用其简单的复制构造函数复制的字段。我的解决方案,告诉any*class的实现者,他必须使用被复制的对象调用copy_info()看起来容易出错。有更好的解决方案吗?

0 个答案:

没有答案