假设我们有通常的菱形图案:
class A
{
public:
virtual char foo() = 0;
virtual ~A() {}
};
class B : public A
{
public:
virtual char foo() { return 'B';}
virtual ~B() {}
};
class C : public A
{
public:
virtual char foo() { return 'C';}
virtual ~C() {}
};
class D : public B, public C
{
public:
virtual char foo() { return 'D';}
virtual ~D() {}
};
请注意,基类A
没有任何数据成员。它实际上只是一个纯虚方法的接口。
现在如果我这样做:
D* d = new D();
A* a = static_cast<A*>(d);
编译器会告诉我演员阵容不明确,因为有两个 A 基类。
但如果我这样做:
D* d = new D();
B* b = static_cast<B*>(d); // Or C* c = static_cast<C*>(d);
A* a = static_cast<A*>(b);
现在我有一个指向我的A
基类之一的指针,我可以做到a->foo()
。
这安全吗?
我想知道的是我是否可以进行这种双重向上转换以仅具有指向接口(没有数据成员)的指针而没有虚拟继承的开销。无论如何,我不打算对指针进行向下转换或对其进行任何不调用虚拟方法的操作。
我知道这意味着有两个基类,但由于没有成员,这不重要,或者是吗?
EDIT
:我正在努力寻找一种方法来实现接口,我想我只需要使用虚拟继承。
假设我有一个类Buffer
(接口类)和一个BufferImplementation
派生自它的类。
现在假设我有另一个接口IOBuffer
(从另一个接口派生Buffer
),其IOBufferImplementation
类必须同时从BufferImplementation
接口派生IOBuffer
。
在我之前的示例中,Buffer 为 A,BufferImplementation 为 B,IOBuffer 为 C,IOBufferImplementation 为 D。