Вы должны использовать наследование только тогда, когда у вас есть очень конкретные причины, или когда все другие варианты не лучше и не хуже.Никогда не наследуйте для повторного использования.
Имеет ли материал какое-либо поведение , которое может динамически изменяться?Может ли материал таблицы меняться во время выполнения?Если ответ на любой из этих вопросов положительный, вам, вероятно, понадобится полиморфизм и наследование во время выполнения.Ваш первый дизайн - это хороший шаг в правильном направлении.Ваш второй дизайн, однако, является рискованным и приносит мало на стол (и простите за каламбур).Множественное наследование?Зачем?У вас должна быть очень конкретная и веская причина для использования множественного наследования.
Другой альтернативой разработки является использование полиморфизма во время компиляции.
struct wood { };
struct steel { };
template<class M>
struct table { };
// ...
table<wood> wood_table;