2014-09-25 2 views
1

В C++ существует ли стандартный способ создания функции в базовом классе, который может использовать переменные производных классов?Функции базового класса, которые используют переменные производного класса

class Foo{ 
private: 
    int x; 
public: 
    Foo(){ 
     x = 2; 
    } 
    void print(){ 
     std::cout << x << std::endl; 
    } 
}; 

class Derived : public Foo{ 
private: 
    int x; 
public: 
    Derived(){ 
     x = 4; 
    } 

}; 


void main() 
{ 
    Derived a; 
    a.print(); 
} 

Этот код печатает переменную базового класса (2). Есть ли способ сделать функцию, используемую многими производными классами, использовать частные переменные класса, не передавая их в качестве параметров?

Редактировать: Мое намерение состоит в том, чтобы избежать написания того же кода для каждого производного класса. Например, я хочу get_var() во всех, но эта функция должна возвращать переменную этого собственного класса. Я знаю, что могу делать виртуальные и переопределять, но я искал способ, который мне не нужно писать снова и снова.

+4

Базовый класс должен не знают ничего о своих производных типах. Требовать, чтобы это был плохой дизайн. – juanchopanza

+2

Вам нужно будет реализовать виртуальный метод 'getA'. –

+2

Если вы объявите 'x' защищенным в Foo и не объявите его снова в Derived. Это то, что вы хотите? – Albi

ответ

4

Нет, базовый класс не может получить доступ к чему-либо непосредственно в производном классе. Единственный способ для производного класса поделиться чем-либо с его базовым классом - переопределить виртуальные функции-члены базового класса.

В вашем случае, однако, это не является необходимым: производный класс может установить переменную x в базовом классе, как только вы сделаете это protected и уронить свою собственную декларацию за ненадобностью:

class Foo{ 
protected: // Make x visible to derived classes 
    int x; 
public: 
    Foo(){ 
     x = 2; 
    } 
    void print(){ 
     std::cout << x << std::endl; 
    } 
}; 

class Derived : public Foo{ 
public: 
    Derived(){ 
     x = 4; 
    } 
}; 
+0

будет ли это переопределять базовый класс x? Если я сделаю несколько производных, все они будут иметь одинаковое значение x/value? – user3023605

+0

@ user3023605 каждый экземпляр производного класса также имеет экземпляр базового класса. Так что нет, каждый экземпляр имеет свой собственный 'x' – clcto

+0

, это именно то, что я искал! Спасибо! Надеюсь, нет никаких недостатков в его методе. – user3023605

Смежные вопросы