【发布时间】:2015-10-29 23:54:22
【问题描述】:
我需要使用 C++ 接口类在 C++ 中实现非托管 DLL。假设我有这个类结构:
class IA
{
public:
virtual void Foo() = 0;
...
};
class A : public IA
{
public:
virtual void Foo() override { ... }
...
};
class IB
{
public:
virtual void Bar() = 0;
...
};
class B : public IB
, public A
{
public:
virtual void Bar() { ... }
...
};
现在,如果我有一个指向接口 IB 的指针,这将无法编译:
IB* b = ...;
b->Foo();
为了让它工作,我必须让IB继承自IA,这样:
class IB : public IA
{
...
};
但这也不会编译,因为现在B 不再是一个具体的类,编译器希望它实现IA::Foo,即使它继承自A。
您可以使用虚拟继承解决此问题:
class A : public virtual IA { ... };
class IB : public virtual IA { ... };
class B : public virtual IB, public A { ... };
在 VC++ 中生成一个新警告:
warning C4250: 'B' : inherits 'A::A::Foo' via dominance
据我了解,这是因为现在有不止一个 Foo 声明。
如何在没有这些问题的情况下正确继承接口及其具体实现?
【问题讨论】:
-
@DieterLücking 这是错误的。感谢您发现它。我修好了它。 :)
-
Here is an answer that explains C4250。如果您对这种并发症没问题,那么它应该可以正常工作。
-
@Guvante 鉴于我使用虚拟继承来继承接口这一事实,我认为我不会遇到那种复杂情况。所以你会说禁用警告是安全的吗?
标签: c++ oop inheritance interface