Załóżmy, że mam następujące definicje klasyWarunkowo dziedziczą z klasy bazowej czysty
struct base {
virtual int f() = 0;
};
struct A: public base {
int f() final { return 1; }
};
struct B: public base {
int f() final { return 2; }
};
Czy to możliwe, aby włączyć A
i B
do szablonów, które mają parametr bool
która określa, czy dziedziczyć z base
czy nie? Mam przypadki użycia, które wymagają lub nie wymagają klasy bazowej zapewniającej wspólny interfejs.
Załóżmy, że A
i B
mają wiele funkcji składowych, więc powielanie implementacji byłoby uciążliwe. Ale sizeof(A)
i sizeof(B)
są małe.
Potrzebujesz dwóch wersji? Zakładając, że 'base' zawiera tylko funkcje abstrakcyjne, nie powinno być żadnych kosztów runtime. W twoim przykładzie twój optymalizator powinien zobaczyć, że 'A' użyje' f() 'stamtąd, ponieważ jest' końcowe'. – Guvante
@ Guwane: Sprawia, że typ jest polimorficzny, co daje mu vtable. Nie koszt runtime, ale koszt niemniej jednak. – ildjarn
@Guvante Wielkość typu dziedziczenia jest większa o wielkość wskaźnika, który wskazuje na tabelę vtable. – SU3