我想把我的代码设计成微软的COM,意思是:
- 我有我的dll,其中有不同的对象实现不同的接口
- 我只向客户端公开了接口(这部分在这里不是一个真正的问题,只是为了给予更多的上下文)。
现在作为一个例子,以这段代码为例(你可以在这里运行它https://onlinegdb.com/Z7RPQVrCZ):
class IParent
{
public:
virtual void foo() const = 0;
};
class IChild : public IParent
{
public:
virtual void bar() const = 0;
};
class Parent : public IParent
{
private:
int a_;
public:
virtual void foo() const override { /* for ex: do something with a_ */ }
};
class Child : public IChild, public Parent
{
public:
virtual void bar() const override {}
// My issue is here:
using Parent::foo;
};
int main()
{
Child c;
return 0;
}
我得到编译错误:main.cpp:38:11: error: cannot declare variable ‘c’ to be of abstract type ‘Child’
如果我将using Parent::foo;
替换为:virtual void foo() const override { return Parent::foo(); }
正常编译。但这又有什么意义呢?我不想推翻它。在某种程度上,我甚至想使Parent::foo
final
例如。
我想问题是Child
继承自IChild
和Parent
,而这两者都继承自IParent
。但随后:
- 为什么explicit
using
不起作用? - 如果它是什么,这是否意味着这个设计只是不符合我的需要在这里?
- 或者我只是执行得不好?
2条答案
按热度按时间gzjq41n41#
使用继承避免菱形的(crtp)mixin示例。通过这种方式,继承被用来聚合具有多个“基”行为的类中的功能。
iyr7buue2#
添加虚拟实际上有效。