Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测和断言特定类的虚拟继承? 我有一个C++类,它实现引用计数,我希望这个类的所有用户都只能从这个类继承,这样就不会有任何对象以多个引用计数器结束。_C++_Visual C++_Inheritance_Virtual Inheritance - Fatal编程技术网

如何检测和断言特定类的虚拟继承? 我有一个C++类,它实现引用计数,我希望这个类的所有用户都只能从这个类继承,这样就不会有任何对象以多个引用计数器结束。

如何检测和断言特定类的虚拟继承? 我有一个C++类,它实现引用计数,我希望这个类的所有用户都只能从这个类继承,这样就不会有任何对象以多个引用计数器结束。,c++,visual-c++,inheritance,virtual-inheritance,C++,Visual C++,Inheritance,Virtual Inheritance,我想在编译时或者至少在运行时使用某种方法来声明这个需求 有没有办法实现? 它可能有一些欺骗,但考虑其含义:你正在设置一个策略,如果对象的引用计数器达到零,对象需要立即自毁。 根据您的应用程序的不同,您可能希望保留它调用的确切时间,删除此项到对象的实现,即在基类中只有add_ref()和release()抽象函数(这使得一个具体的实现在所有接口vtables中以适当的声音显示)并将维护引用计数的负担放在混凝土类上。类似的内容 struct RefCounter { template <

我想在编译时或者至少在运行时使用某种方法来声明这个需求


有没有办法实现?

它可能有一些欺骗,但考虑其含义:你正在设置一个策略,如果对象的引用计数器达到零,对象需要立即自毁。

根据您的应用程序的不同,您可能希望保留它调用
的确切时间,删除此项到对象的实现,即在基类中只有
add_ref()
release()
抽象函数(这使得一个具体的实现在所有接口vtables中以适当的声音显示)并将维护引用计数的负担放在混凝土类上。

类似的内容

struct RefCounter {
    template <typename T>
    RefCounter(T *) {
        BOOST_STATIC_ASSERT(boost::is_virtual_base_of<RefCounter, T>);
    }
};

struct GoodClass : virtual RefCounter {
    GoodClass() : RefCounter(this) {}
};

struct BadClass : RefCounter {
    BadClass() : RefCounter(this) {}
};
struct RefCounter{
模板
参考计数器(T*){
BOOST\u STATIC\u ASSERT(BOOST::is\u virtual\u base\u of);
}
};
结构GoodClass:虚拟引用计数器{
GoodClass():RefCounter(this){}
};
结构BadClass:RefCounter{
BadClass():RefCounter(this){}
};

但是,需要将
这个
传递给构造函数以捕获派生类型,这让人感到遗憾。当然,一个故意迟钝的用户可以通过传递除
这个
之外的其他东西来破坏它,我认为包装类将是最简单的选择。创建一个中间类,而不是直接从RefCounter继承

struct RefCounterVirtPrivate_
{
    int count;

    RefCounterVirt()
        : count( 0 )
    { }
};

struct RefCounter : public virtual RefCounterVirtPrivate_
{
};

struct A : public RefCounter { };
struct B : public RefCounter { };
struct C : public A, public B { };
然后,一切都可以从
RefCounter
继承,而无需关心虚拟继承。您甚至不必更改任何现有代码--
RefCounter
本身的虚拟继承应该是无害的


当然,这并不能保证人们不会直接从
RefCounterVirtPrivate\uu
继承,但这就是为什么我给它起了一个明显的名字。意外地这样做比忘记一个
virtual
关键字更难。

实际上这个类总是
删除这个
本身,所以我可以在
addref()
/
release()
中进行检查。所以这种欺骗是受欢迎的。你可以使用CRTP而不是
这个
,但我认为你的解决方案更好。@sbi:我考虑过,但是
RefCounter
RefCounter
将是不同的类,因此,即使它们是虚拟的,您仍然可以得到多个refcounter基类子对象。如果一个类从两个基类继承,一个基类从
refcounter
虚拟继承,而另一个基类从非虚拟继承,那么这是否可行?@sharptooth:“其他”类应该触发断言,因此,您甚至无法了解从这两个类继承的类。解决方案看起来很棒,除了一件事-它需要实际更改已从
RefCounter
继承的每个类,这是相当多的工作。