Код, который вы предоставили, к сожалению, не скомпилируется как есть. Мы можем создать подобный пример и просто попробовать его:
#include <cstdio>
struct A
{
virtual char const * get() {return "a";};
virtual ~A() = default;
};
struct B : public virtual A
{
char const * get() override {return "b";};
};
struct C : public virtual A
{
//char const * get() override {return "c";};
};
struct D : public B, public C
{
//char const * get() override {return "d";};
};
int main()
{
A* a = new A();
B* b = new B();
C* c = new C();
C* d = new D();
printf("%s\n", a->get());
printf("%s\n", b->get());
printf("%s\n", c->get());
printf("%s\n", d->get());
delete a;
delete b;
delete c;
delete d;
}
, что дает:
a
b
a
b
iso cpp вызывает это делегирование в родственный класс
Поскольку B
и C
оба фактически наследуют A
, существует только один экземпляр A
, поэтому в виртуальной таблице, когда B
переопределяет реализацию A
, только один член переопределяет get
, и это также переопределяется для D
.
Если вы также раскомментируете метод get
в C
, тогда мы получим:
virtual.cc:19:8: error: no unique final overrider for 'virtual const char* A::get()' in 'D'
19 | struct D : public B, public C
|
Однако дальнейшая модификация примера, а также раскомментирование get
в D
приведут к повторной компиляции кода. Сейчас возвращаемся:
a
b
c
d