【发布时间】:2017-03-29 09:55:53
【问题描述】:
考虑以下架构:
class A //abstract interface
{
public:
virtual void f() = 0;
};
class AA : public A //abstract interface
{
public:
virtual void g() = 0;
};
class AAA : public AA //abstract interface
{
public:
virtual void h() = 0;
};
class B : public A // implementation class
{
public:
void f() override {};
};
class BB : public B, public AA {}; // implementation class
{
public:
void g() override {};
};
class BBB : public BB, public AAA {}; // implementation class
{
public:
void h() override {};
};
因此,BB 和 BBB 是虚拟类,因为 f 没有被 BB 覆盖,f 和 g 都没有被 BBB 覆盖。我的愿望是能够实例化BB和BBB(这样BB和BBB使用B定义的f的覆盖,BBB使用BB定义的g的覆盖)。
问题是:应该将哪些继承关系标记为virtual来实例化BB和BBB?
理想情况下,继承图应如下所示:
A
|\
| \
| \
AA B
| \ |
| \ |
AAA BB
\ |
\ |
BBB
此设计背后的理念是 A、AA 和 AAA 是描述增量功能级别的接口。 B、BB 和 BB 是一种对应的增量实现。 (例如,BB 定义了 AA 所需的所有内容,并且还包含 B 中的内容)
【问题讨论】:
-
我认为,您的类定义中缺少虚拟修饰符,否则您的整个问题没有意义。细节很重要
-
当然,我指的是函数的虚拟修饰符
标签: c++ interface multiple-inheritance virtual-functions diamond-problem