Может ли класс наследовать как от абстрактного класса, так и от класса CRTP? Или, если я наследую от класса CRTP, должны ли все классы, которые я наследую, использовать CRTP?
Да.
class AbstractBase {
public:
virtual ~AbstractBase() {}
virtual void Function() = 0;
};
template<class T>
class CRTPBase {
public:
void Function2() {}
};
class Derived : public AbstractBase, public CRTPBase<Derived> {
public:
void Function() {}
};
int main () {
Derived d;
d.Function();
d.Function2();
}
Может ли класс наследовать как от абстрактного класса, так и от класса CRTP?
Почему бы и нет? Да, оно может.
Или, если я наследую от класса CRTP, должны ли все классы, которые я наследую, использовать CRTP?
Почему так? Нет, они не должны.