2017-07-22 4 views
0

Je veux créer un objet ab de la classe de base Foo qui initialise la value variable quelque chose que je décide, je veux ensuite créer un objet de la classe dérivée Bar et la valeur de la variable que je décidais Les premiers bâtons avec Foo héritent de Bar, comme une initialisation constante une fois pour la valeur de la variable.Initialisation de la valeur de classe de base pour la classe dérivée

Y at-il un moyen de le faire sans passer la valeur chaque fois que je crée l'objet Bar comme avec l'objet Foo ou que la valeur de la classe est définie par défaut à 5?

Exemple:

// Base class 
class Foo { 
private: 
    int value; 
public: 
    Foo() {} 
    Foo(int value) : value(value) {} 
    int getValue() { return value; } 
}; 

// Derived class 
class Bar : public Foo { 
private: 
public: 
    Bar() {} 
}; 

Foo foo(5); 
foo.getValue() // 5 
Bar bar; 
bar.getValue() // this I also want to be 5 now 
+0

Si je comprends bien votre objectif, il semble condamné. Vous n'héritez pas d'un objet/instance de classe de base, vous héritez de la classe de base, la classe ne connaît pas la valeur d'une variable membre d'un objet existant. Est-ce que stocker une référence à l'objet que vous essayez "d'hériter" aide à atteindre ce que vous voulez? – Yunnosch

+0

Votre exigence consiste à implémenter un effet de bord dans la construction de la classe de base qui affecte toutes les constructions de classes dérivées suivantes. C'est déroutant, c'est le moins qu'on puisse dire. Faire cela dans un style orienté objet est possible. Vous pouvez écrire une classe de fabrique avec un constructeur acceptant la valeur de la variable. Les objets créés par l'usine seront créés avec cette valeur. –

Répondre

2

Vous pouvez le faire avec des variables statiques, soit dans la portée de la classe ou de la portée de la méthode (ce dernier ayant quelques différences, comme l'initialisation paresseuse, fil d'initialisation en sécurité, etc. Bien que, il ne ne pas faire une grande différence dans votre cas d'utilisation, mais il est bon de garder ce dernier à l'esprit en option). Par exemple

#include <iostream> 

using std::cout; 
using std::endl; 

// Base class 
class Foo { 
private: 
    static int value; 
public: 
    Foo() {} 
    Foo(int value) { 
     Foo::value = value; 
    } 
    int getValue() { return value; } 
}; 

int Foo::value = 0; 

// Derived class 
class Bar : public Foo { 
private: 
public: 
    Bar() {} 
}; 

int main() { 
    Foo foo(5); 
    cout << foo.getValue() << endl; 
    Bar bar; 
    cout << bar.getValue() << endl; 
} 

Je viens de vous fournir une solution que vous voulez. Gardez à l'esprit que ce n'est peut-être pas la meilleure façon de réaliser ce que vous voulez. Les paramètres de construction d'un objet ne devraient idéalement affecter que l'objet courant.