C ++ en ligne de moulage et de coulée dans des travaux variables différemment

class Old
{
    protected:
        long val;
    public:
        long myVal()
        {
            return val;
        }

        void myVal(long val)
        {
            this->val = val;
        }
};

template class In: virtual public Old
{
    protected:
        T value;

    public:
        void setValue(T val)
        {
            value = val;
        }

        T getValue()
        {
            return value;
        }
};


class My: public In, public In
{

};

int main(int argc, char **argv)
{
    My m;
    m.myVal(100);
    In iv = (In) m;
    std::cout << "start_ils: " << ((In)m).getValue() << std::endl;
    std::cout << "start_vs: "<< iv.getValue() << std::endl;
    ((In)m).setValue(10);
    std::cout << "=== old's val ===" << std::endl;
    std::cout << "old_vs: "<<< std::endl;
    std::cout << "old_ilsi: " << ((In)m).myVal() << std::endl;
    std::cout << "old_ilsb: " << ((In)m).myVal() << std::endl;
    std::cout << "=== set_ils ===" << std::endl;
    std::cout << "get_ils: " << ((In)m).getValue() << std::endl;
    std::cout << "get_vs: "<< iv.getValue() << std::endl;
    iv.setValue(10);
    std::cout << "=== set_vs ===" << std::endl;
    std::cout << "get_ils: " << ((In)m).getValue() << std::endl;
    std::cout << "get_vs: "<< iv.getValue() << std::endl;
}

ce code produit cette sortie:

start_ils: -2126649320
start_vs: -2126649320
=== old's val ===
old_vs: 100
old_ilsi: 100
old_ilsb: 100
=== set_ils ===
get_ils: -2126649320
get_vs: -2126649320
=== set_vs ===
get_ils: -2126649320
get_vs: 10

Qu'est-ce qui fonctionne différemment, si je lance My to In pour accéder à int getValue() quand je le fais en ligne ou tout d'abord dans une variable? On dirait que c'est l'accès mauvais segment mais plus étrange que si je fais en ligne mouler My to In, je ne peux pas accéder à la bonne valeur de In, mais il accède correctement au super type long val .

gcc version 4.7.2 (Debian 4.7.2-5)

0
Oui, la première impression est de montrer qu'il y a la même chose en utilisant les deux différents acteurs. Seconde j'accède à la variable de la super-classe Vieux avec 3 façons différentes et fonctionne. Troisièmement, je définis la variable avec la distribution en ligne et les valeurs restent identiques au démarrage. La dernière façon: fonctionne partiellement, si j'accède avec une variable vi. Beacuse de Ma classe est héritée de In et In les compiles ne sauront pas ce que je veux si j'appelle getValue (). Devrait retourner int ou bool?
ajouté l'auteur Dankó Dávid, source
C'est ce que je veux exactement, mais jusqu'à ce moment je ne sais pas comment. Merci :)
ajouté l'auteur Dankó Dávid, source
S'il vous plaît enlever les moulages. Avez-vous des erreurs de compilateur? Si oui, quelles sont les erreurs? Sont-ils des erreurs indiquant que "les types ne sont pas compatibles" ou des messages similaires? Si c'est le cas, il y a une bonne raison à cela, et le lancement pour fermer le compilateur est un signe que les choses peuvent/iront mal.
ajouté l'auteur PaulMcKenzie, source
Au lieu de diffuser, vous pouvez spécifier la classe à laquelle faire référence à l'aide de l'opérateur de résolution de portée. Voici un exemple: ideone.com/kC0TSX
ajouté l'auteur PaulMcKenzie, source

1 Réponses

Votre code provoque un comportement indéfini en imprimant des variables non initialisées. Les résultats de ceci peuvent être instables.

Pour résoudre ce problème, initialisez val et value avant d'essayer de les imprimer. (Notez qu'avec l'héritage virtuel, seul le constructeur le plus dérivé devrait initialiser une variable).

Vous n'avez pas dit quelles parties de votre sortie de programme vous n'avez pas compris. Je suppose que vous vous attendiez à ce que les deux dernières lignes de sortie affichent le même nombre.

Perhaps you are unaware that (In)m copy-constructs a temporary object from m.

The line ((In)m).setValue(10); creates a temporary object, sets its value to 10, then destroys the temporary object. It does not affect m.

The line In iv = (In) m; makes iv be a copy of part of m. Future changes to m would not affect iv. When you write iv.setValue(10), that updates iv but not m.

If you want to refer to m via base class, use static_cast &>(m). The & means to form a reference, instead of copying by value. You probably also intended to have In &iv = m; instead of In iv = (In) m;.

0
ajouté
Vraiment, le constructeur de copie par défaut a causé ce comportement «étrange» que j'oublie complètement. Merci :)
ajouté l'auteur Dankó Dávid, source