c ++ Удалить наследуемую переменную-член в дочернем классе - PullRequest
0 голосов
/ 03 января 2019

Рассмотрим следующий код:

Struct Base 
{
   int x;
   double y;    
}

Struct A : public Base
{   
}

Struct B : public Base
{  //here I don't want x (Base::x) to be inherited.
   // is there a way to delete it (something like delete Base::x)
}

Struct C : public Base
{   
}

Что считается наилучшей практикой для решения такой задачи?x должно быть унаследовано A и C, (и, возможно, многими другими классами), поэтому я не могу поместить его в закрытый раздел Base.Единственный способ, которым я вижу, - это удалить x из Base и поместить его в A & C.Но должен быть другой путь, верно?Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Нет способа «удалить» унаследованные элементы данных, и вы даже не можете их скрыть.Они получают неотъемлемую часть подкласса.Если B наследует только части Base, вам нужно разделить Base:

Struct Base 
{
   double y;    
}

Struct BaseWithX : public Base
{
   int x;
}

Struct A : public BaseWithX
{ }

Struct B : public Base
{ }

Struct C : public BaseWithX
{ }
0 голосов
/ 03 января 2019

Публичное наследование создает отношение is-a. Это означает, что B является Base. А это значит, что если Base имеет x, то, поскольку B является Base, B будет иметь x. Вам нужно пересмотреть этот дизайн, если у вас есть такая проблема. Попробуйте переключить отношения между B и Base на композицию:

struct B {
    void some_function_using_base();
private:
    Base base_;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...