2016-12-29 3 views
0

Рассмотрим следующий код.Переменная Переопределение в C++

class Base1 
{ 
public: 
    void func1(float x) 
    {var1 = x;} 

private: 
    float var1; 
}; 


class Derived1: public Base1 
{ 
public: 
    void func1(int x) 
    {var1 = x;} 

private: 
    int var1; 
}; 

Это хорошая идея переопределить переменную var1 с новым типом данных (целое в этом примере)? Есть ли проблемы с этим? (например: shadowing!)

+0

Наверное, это не очень хорошая идея, но и не опасная. – AndyG

+0

вы можете сделать 'int var1' в разделе' protected' класса 'Base1', тогда он будет доступен из' Derived1' – paweldac

+0

базовое поле в вашем примере является приватным в любом случае ... –

ответ

1

Вообще говоря, замена переменной родителя на новую с тем же именем может быть запутанной и подверженной ошибкам.

В вашем примере заменена не только переменная, но и функция, которая ее устанавливает, под названием «Скрытие имени» (вы имеете в виду ее как «Тени»).

Кажется, вам не нравится атрибут родителя (и, вероятно, поведение), и это может быть сигнал о том, что ваша иерархия классов должна быть пересмотрена.

Вы можете прочитать о обосновании «Сокрытие имени» в качестве функции языка here.

+0

Спасибо за ответ. Но переменная в базовом классе целенаправленно выбирается как «частная», так что переменная не будет доступна в классе Derived. Поэтому я думал, что это не должно создавать путаницы в классе Derived. – Soo