Je pose cette question à propos de C ++ puisque je suis familier avec cela, mais la question s'explique vraiment: existe-t-il un langage dans lequel nous pouvons dériver une classe et la faire occuper moins d'espace en mémoire que la classe d'origine?

Cette question est plus un gadget qu'un problème réel que j'essaie de résoudre, mais je pourrais imaginer que certains codes très performants pourraient bénéficier de ce type d'optimisation de la mémoire:

Supposons que nous ayons:

class Person {
    std::string name;
    unsigned int age;
}

class PersonNamedJared {
}

En théorie, nous n'avons pas besoin d'un champ "nom" dans cette sous-classe car ce sera toujours "Jared", ce qui pourrait permettre une meilleure efficacité de la mémoire.

Est-ce que le seul moyen d'y parvenir est de remplacer le champ 'name' dans Person par une fonction get_name() que nous remplaçons simplement dans PersonNamedJared pour toujours renvoyer "Jared"? Comment pourrions-nous encore créer la variable de nom dans la classe de base?

Je sais que cet exemple est vraiment une mauvaise pratique, mais c'est le meilleur que je puisse trouver. Je pense qu'il y a des raisons légitimes de mettre en œuvre ce type de modèle.

4
Adriaan Jacobs 8 mai 2020 à 00:13

3 réponses

Meilleure réponse

Une classe dérivée peut-elle être plus petite que sa classe parente?

Non. Une classe dérivée contient toujours un sous-objet de classe de base. Un objet ne peut jamais être plus petit que ses sous-objets, donc une classe dérivée ne peut jamais être plus petite que sa base.

Est-ce que le seul moyen d'y parvenir est de remplacer le champ 'name' dans Person par une fonction get_name () que nous remplaçons simplement dans PersonNamedJared pour toujours renvoyer "Jared"?

Ce serait une façon d'y parvenir.

Comment pourrions-nous encore créer la variable de nom dans la classe de base?

Vous ne pouvez pas avoir une variable membre dans une base que vous ne souhaitez pas faire partie de la classe dérivée.

Vous pouvez par exemple utiliser l'héritage multiple afin d'avoir une base avec la variable dans certaines classes dérivées. Quelque chose comme ça:

struct Person {
    unsigned int age;
    virtual std::string name() = 0;
};

struct Named {
    std::string name;
};

struct NamedPerson : Named, Person {
    std::string name() override {
        return name;
    }
};

struct JaredPerson : Person {
    std::string name() override {
        return "Jared";
    }
};

Ici, il y a une base avec la variable, mais Jared n'hérite pas de cette base particulière.

5
eerorika 7 mai 2020 à 21:23

Non.

Hériter d'une classe signifie que vous incluez toutes ses variables membres, ses variables membres de classe [s] parent, plus tout ce que contient votre propre classe.

Pour le dire autrement, les classes enfants sont un sur-ensemble de classes parentes. (à l'exception d'une classe enfant vide)

Même les membres privés sont encore occupant de l'espace, c'est juste une erreur du compilateur pour essayer d'y accéder.

1
Mark Storer 7 mai 2020 à 21:24

Une classe dérivée peut-elle être plus petite que sa classe parente?

En C ++, non!

Même si vous essayez de remplacer un membre de la classe de base par un membre plus petit dans la classe dérivée (en utilisant le même nom), le membre de la classe de base est toujours là (il est simplement plus difficile d'accéder). Ce code démontrera que, avec la classe dérivée en fait ajoutant à la taille de la base:

#include <iostream>

class A {
public:
    double q[200];
};

class B : A {
public:
    double q[100]; // Can we replace base array with a smaller one?
};

int main()
{
    std::cout << sizeof(A) << std::endl; // -> 1600 = 200 * sizeof(double)
    std::cout << sizeof(B) << std::endl; // -> 2400 ADDS 100 more doubles!
    return 0;
}
0
Adrian Mole 7 mai 2020 à 21:33