Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
но получить тот же функционал, что в C# и Java (композиция интерфейсов), все равно не получится
Почему?
А можно минимальный пример? A то я что-то не соображу где проблема будет. В смысле, где вылезет наследование от одного интерфейса несколько раз.
struct I0 {
virtual ~I0() = default;
virtual void base() = 0;
};
struct I1 : I0 {
virtual ~I1() = default;
virtual void foo() = 0;
};
struct I2 : I0 {
virtual ~I2() = default;
virtual void bar() = 0;
};
struct I12 : I1, I2, I0 {
~I12() override { printf("~I12\n"); }
void base() override { printf("base\n"); }
void foo() override { printf("foo\n"); }
void bar() override { printf("bar\n"); }
};
int main() {
I0* i0 = new I12;
i0->base();
delete i0;
printf("\n");
I1* i1 = new I12;
i1->base();
i1->foo();
delete i1;
printf("\n");
I2* i2 = new I12;
i2->base();
i2->bar();
delete i2;
printf("\n");
printf("Size0: %llu\n", sizeof(I0));
printf("Size1: %llu\n", sizeof(I1));
printf("Size2: %llu\n", sizeof(I2));
printf("Size12: %llu\n", sizeof(I12));
return 0;
}
error: 'I0' is an ambiguous base of 'I12'
struct I12 : I1, I2 {
...
};
int main() {
I0* i0 = static_cast<I1*>(new I12);
...
struct I0 {
virtual ~I0() {};
virtual void base() = 0;
};
struct I1 : I0 {
virtual ~I1() {};
virtual void foo() = 0;
};
struct I2 : I1, I0 {
virtual ~I2() {};
virtual void bar() = 0;
};
struct I12 : I1, I2, I0 {
~I12() override { printf("~I12\n"); }
void base() override { printf("base\n"); }
void foo() override { printf("foo\n"); }
void bar() override { printf("bar\n"); }
};
Если интерфейсные классы не содержат данныхОни содержат указатели на таблицу виртуальных функций, пусть эта деталь реализации от нас компилятором и скрывается
Перевод С++ проекта на разработку с юнит-тестированием/TDD