您要做的是从两个可能具有共同基类的类继承,对吗?在这种情况下,您应该处理虚拟继承问题(即,您必须将您感兴趣的两个类的基类继承声明为虚拟)。由于一些运行时支持(更多 2 个 vpointer),这只会导致很小(可能微不足道)的开销。
您的代码不是 CRTP(在 CRTP 中,基类是接收派生类的模板),并且似乎没有以任何方式解决您试图摆脱的双重继承问题。
据我所知,您可以接受虚拟继承并使用虚拟关键字以最小的开销产生,或者您可以重构您的代码。
我不完全理解您要做什么,但是如果您尝试从具有公共基类的两个不同类继承(虚拟继承就是这样)并且由于某种原因您不想使用virtual关键字,那么您可以按以下方式使用 CRTP:
#include <iostream>
using namespace std;
template<class Derived>
class Base
{
public:
void basefunc() { cout << "base here"<< endl; }
virtual void polyfunc() { cout << "base poly here"<< endl; }
};
class Derived : public Base<Derived>
{
public:
void derivedfunc() { cout << "derived here"<< endl; }
virtual void polyfunc() { cout << "derived poly here"<< endl; }
};
class OtherDerived : public Base<OtherDerived>
{
public:
void otherderivedfunc() { cout << "otherderived here"<< endl; }
virtual void polyfunc() { cout << "otherderived poly here"<< endl; }
};
class InheritingFromBoth : public Derived, public OtherDerived
{
public:
void inheritingfunc() { cout << "inheritingfromboth here" << endl; }
virtual void polyfunc() { cout << "inheritingfromboth poly here"<< endl; }
};
int main() {
Derived obj;
OtherDerived obj2;
InheritingFromBoth *obj3 = new InheritingFromBoth();
Derived *der = dynamic_cast<Derived*>(obj3);
der->polyfunc();
OtherDerived *der2 = dynamic_cast<OtherDerived*>(obj3);
der2->polyfunc();
Base<Derived>* bptr = dynamic_cast<Base<Derived>*>(obj3);
bptr->polyfunc();
Base<OtherDerived>* bptr2 = dynamic_cast<Base<OtherDerived>*>(obj3);
bptr2->polyfunc();
return 0;
}
通过创建基类的两个不同实例,您将避免继承歧义。
如果您打算同时从基类和基派生类继承,一个更简单、或许更清洁、更好的解决方案如下:
- 从类 Base和从 Base 派生类继承让我认为您希望能够同时访问 Base 方法和 Base 派生方法..
如果您在类设计中注意潜在的名称隐藏 问题,并且只是使用多态性来“定制”您真正想要不同的函数的行为(并且可以进行强制转换控制),那么Base -> Derived -> YourClass
最终可以解决一个干净的层次结构你的问题。
在您的特定情况下,您的方法有效,正如其他人在许多应用程序中使用的那样,但我认为不能有效地解决您的双重继承问题。最终,只有特定的设计案例才能导致邪恶程度较低的解决方案。