多继承-C++类之间的共享实现
multiple inheritance - Sharing implementation between C++ classes
我希望能够在同一基类的某些类(而不是所有类)之间共享实现。为了概念的正确性,我想使用C++的多重继承功能来实现这一点(我知道一个解决方案可能是使用组合)。
class A
{
public:
A()
{
cout << "Constructed A" << endl;
}
void DoAStuff()
{
cout << "Did A stuff" << endl;
}
};
class I : public virtual A
{
public:
I()
{
cout << "Constructed I" << endl;
}
void DoIStuff()
{
DoAStuff();
cout << "Did I stuff" << endl;
}
};
class B : public A
{
public:
B()
{
cout << "Constructed B" << endl;
}
void DoBStuff()
{
cout << "Did B stuff" << endl;
}
};
class C : public A, public I
{
public:
C()
{
cout << "Constructed C" << endl;
}
void DoCStuff()
{
cout << "Did C stuff" << endl;
}
};
class D : public A, public I
{
public:
D()
{
cout << "Constructed D" << endl;
}
void DoDStuff()
{
cout << "Did D stuff" << endl;
}
};
int main()
{
cout << "Creating a B" << endl;
B *b = new B();
cout << "Creating a C" << endl;
C *c = new C();
c->DoIStuff();
cin.ignore();
return 0;
}
在本例中,我有blase类A
,以及从A
派生的3个类:B
、C
和D
。
C
和D
都有共同的实现,我在单独的类I
中实现了DoIStuff()
。由于这个实现需要做基类A
中定义的东西,所以I
也继承了A
。虚拟关键字是存在的,因为在创建C
或D
时,我只想要A
的一个实例。
这一切对我来说似乎很美好,很有表现力,但当我试图编译它时(使用VS2008的VC++编译器),我得到了以下2个错误:
error C2584: 'C' : direct base 'A' is inaccessible; already a base of 'I'
error C2584: 'D' : direct base 'A' is inaccessible; already a base of 'I'
为了在多重继承的情况下实现这一点,添加一个继承A
(但不做任何其他事情)的"占位符"类(例如J
),并从该类继承D
和C
,而不是直接从A
继承似乎是可行的。然而,这个占位符类会降低代码的表达能力,并使其难以理解。
或者,我可以让DoIStuff
取一个A
参数,这意味着I
不必从A
继承。然而,这意味着我必须在D
和C
中过载DoIStuff
。
有人知道在这种情况下共享实现的最佳解决方案是什么吗?
您需要
1. class D : public virtual A, public I
2. class C : public virtual A, public I
否则,无法正确设置多重继承的菱形。
也要阅读一下奇怪的重复出现的模板模式。这可能是一个可行的替代方案。
相关文章:
- 为共享 ptr 向量实现复制 c'tor?
- 使用共享指针实现复制 c'tor?
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存的升压容器是否实现锁定?
- 如何实现共享数据的复制构造函数
- 具有特定于枚举的实现和共享功能 (CRTP) 的类模板
- 这是MSVC 2013中具有共享PTR的单例的正确实现吗?
- C++实现相同接口的对象/类之间的数据共享
- OpenMP:共享同一算法的单线程和多线程实现
- 共享库链接到具有通用接口但不同实现的静态库
- CUDA:共享内存的超载以用多个数组实现还原方法
- 如何从实现与其他接口共享的接口的类继承
- 如果类未完全实现,是否可以强制共享C++库无法生成?
- 如何实现赋值运算符,使多个实例共享公共数据
- 如何停止在共享库中实现的阻塞pthread_join()
- 如何使用C 中的共享/弱指针清洁实现两个对象
- 在C++11中实现共享整数计数器而不使用互斥的最简单方法:
- QString 的隐式共享实现如何线程安全?
- 使用C++生成泛型类型-一个具有共享实现的模板
- 多继承-C++类之间的共享实现