У меня есть эта часть кодаВиртуального наследования неоднозначной функция
#include <iostream>
using namespace std;
class A {
public:
int i;
A(){i = 0; }
virtual void f() { cout << i; }
};
class B1 : virtual public A {
public:
B1() { f(); }
void f() { cout << i+10; }
};
class B2 : virtual public A {
public:
B2() { f(); }
void f() { cout << i+1; }
};
class C : public B1, public B2 {
public:
C() {}
};
void main(){
C c;
//c.A::f();
}
Первой, я понимаю, основная идею использования виртуального наследования (ромб) для того, чтобы создать только один A
объекта в памяти.
В этом примере, я получаю ошибку компиляции в классе C
:
override of virtual function "A::f" is ambiguous
Если удалить virtual
наследство. Код компилируется, нет ошибки в классе C
, как и раньше.
Если я удалю комментарий из последней строки кода, он все еще компилируется. Я понимаю, что в этом случае функция f()
, которая будет выполнена, является первой из первого класса, которую наследует C
.
Теперь, если я меняю c.A::f()
на c.f()
Я получаю ошибку компиляции на этой конкретной строке.
Может кто-нибудь объяснить это поведение и различия между этими случаями?
Кто сказал, что не по теме ??? Это просто дубликат. –