Чтобы понять разницу между виртуальной и не виртуальной проверкой наследования (и попытаться понять) код:
#include <iostream>
using namespace std;
struct Base {
int a;
};
struct D11 : virtual Base {};
struct D12 : virtual Base {};
struct D21 : Base {};
struct D22 : Base {};
struct E1: D11, D12 {
std::pair<int, int> func(int i1, int i2){
dynamic_cast<D11*>(this)->a = i1;
dynamic_cast<D12*>(this)->a = i2;
return std::pair<int, int>(dynamic_cast<D11*>(this)->a, dynamic_cast<D12*>(this)->a);
}
};
struct E2: D21, D22 {
std::pair<int, int> func(int i1, int i2){
dynamic_cast<D21*>(this)->a = i1;
dynamic_cast<D22*>(this)->a = i2;
return std::pair<int, int>(dynamic_cast<D21*>(this)->a, dynamic_cast<D22*>(this)->a);
}
};
int main(){
E1 e1;
E2 e2;
std::pair<int, int> p1, p2;
p1 = e1.func(1,2);
p2 = e2.func(3,4);
cout << "p1: " << p1.first << ", " << p1.second << endl; // Will return p1: 2, 2
cout << "p2: " << p2.first << ", " << p2.second << endl; // will return p2: 3, 4
return 0;
}
Это легче понять, если представить это так:
Иногда приятно иметь возможность хранить разные значения переменных в разных базах. Иногда наоборот. C ++ позволяет выбирать.