我迷路了
Foo
s和the
Bar
s和the
Interfaces
,所以我要重写类层次结构,保持相同的结构:
struct Base {
virtual void foo() = 0;
}
struct Intermediate1 : Base {
};
struct Intermediate2 : Base {
void foo();
}
struct Derived : Intermediate1, Intermediate2 {
};
Derived d; // error: can't create object of an abstract type
一个对象
Derived
有两个类型为的子对象
Base
,一个通过
Intermediate1
另一个过来了
Intermediate2
因此,它具有两种不同的功能
foo
,一个通过
中间体1
还有一个进来了
中间体2
.由于
中间体1
不覆盖
Base::foo
(以及
衍生
也不会覆盖它),它仍然是一个纯虚函数,所以
衍生
是一个抽象类,不能实例化。
另一方面(以及有多少人认为“接口”是继承的(引用是因为C++没有“接口”的正式概念),类似的层次结构可能如下:
struct Base {
virtual void foo() = 0;
}
struct Intermediate1 : virtual Base {
};
struct Intermediate2 : virtual Base {
void foo();
}
struct Derived : Intermediate1, Intermediate2 {
};
Derived d; // okay, via "dominance"
注意添加
virtual
对于直接从中导出的类
基地
.现在是一个类型为的对象
衍生
只有一个子对象类型
基地
,以及
统治地位
规则说,在
衍生
,
Intermediate2::foo
覆盖
基:foo
,即使中没有覆盖
中间体1
所以
中间体1
它本身是一个抽象类,但是
衍生
不是,即使它没有覆盖
基:foo
; 通过覆盖
中间体2
足够了。