Правильна ли эта практика?
Я думаю, что это превращается в основанный на мнении вопрос-ответ.Если все ваши производные классы должны включать членов a
и b
, , то, по моему мнению, , они должны быть частью базового класса.Таким образом, вам гарантировано, что все ваши производные классы будут включать членов a
и b
, и вы (или кто-то еще) не рискуете забыть включить их.Кроме того, добавляя члены в базовый класс, вы экономите память, не добавляя их в каждый производный класс.virtual
в C ++ предоставляет вам все необходимые инструменты для достижения полиморфизма, что и происходит, когда вы создаете массив Base *
.
. Я бы также рекомендовал использовать ключевое слово override
для виртуальных функций.которые переопределяются в производном классе, и ключевое слово final
для производных классов, которые не предназначены стать базовыми классами.Вы можете ознакомиться с преимуществами использования этих ключевых слов из книги Скотта Мейерса по современному C ++.
struct Base
{
int a, b;
Base(int a_, int b_) : a(a_) , b(b_)
{;}
virtual void function() = 0;
};
struct A : Base // A can be a base class of another class.
{
A(int a_, int b_) : Base(a_,b_)
{;}
void funtion() // this will compile, but it's not going to override the Base::function()
{;}
};
struct B final : Base // B can never become a base class.
{
B(int a_, int b_) : Base(a_,b_)
{;}
void funtion() override // this won't compile because override will see that we mis-spelled function()
{;}
};
Однако не существует правила C ++, которое запрещало бы включать членов во все ваши производные классы.
Кроме того, если все ваши члены public
, вы можете использовать struct
, чтобы избежать необходимости вводить public
внутри классов и в методе наследования.
struct Base
{
// all members are public
};
struct Derived : Base // public inheritance by default.
{
// all members are public
};