如何检测和断言特定类的虚拟继承? 我有一个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
继承的每个类,这是相当多的工作。