8
votes

C ++: héritage de deux classes de base avec le même nom, espace de noms différent

est-il possible d'hériter de deux classes de base qui ont le même nom, si les espaces de noms sont dans différents espaces de noms?

Au fait, je ne prévois pas à ce moment-là, mais j'étais curieux: xxx


5 commentaires

BTW, vous avez oublié de mentionner «Public» «Protégé» ou «Privé» dans l'héritage.


@ Soulsurferfer2010: Il n'est pas nécessaire d'indiquer public , protégé ou privé . Dans ce cas, il est par défaut à privé puisqu'il s'agit d'une classe . Pour un struct , il est par défaut sur publique . Personnellement, j'additionne toujours explicitement le modificateur d'accès, mais le code de l'OP est valide C ++ en ce qui concerne l'indice des classes de base.


RE: "Est-il possible d'hériter de deux classes de base qui ont le même nom, si les espaces de noms sont dans différents espaces de noms?" La réponse est oui, car ils ont des noms différents


@JohnDibling Oui, cela a été expliqué dans la réponse de @ Greghewgill ci-dessous.


En fait, par toutes les réponses, mais Greg est le plus clairement libéré


6 Réponses :


1
votes

Physique :: Forme & Graphics :: Forme respectivement?


0 commentaires

7
votes

classes dans différents espaces de noms réellement do ont des noms différents (en ce qui concerne C ++ concerné), même si la dernière partie du nom ( forme dans votre exemple) pourrait être le même. La résolution de nom est effectuée sur le nom pleinement qualifié , y compris tous les espaces de noms.


0 commentaires

9
votes

Eh bien, simplement:

SuperShape( int x, int y, float color)
    : Physics::Shape( x, y ), Graphics::Shape( color )
{
}


0 commentaires

2
votes

Oui. Les initialiseurs de la mémoire du constructeur devront utiliser des noms qualifiés.

SuperShape::SuperShape( int x, int y, float color )
    : Physics::Shape( x, y ), Graphics::Shape( color )
{ /*...*/ }


0 commentaires

11
votes

Bien sûr, pourquoi pas? Rien ne vous empêche de le faire. Voici un exemple de travail:

#include <iostream>
#include <typeinfo>
#include <string>

namespace NS1 {

class MyClass {
public:
    MyClass (const std::string &) {}
};

}

namespace NS2 {

class MyClass {
public:
    MyClass (int) {}
};

}

class MyClass :
    public NS1::MyClass,
    public NS2::MyClass
{
public:
    MyClass () :
        NS1::MyClass (std::string ("Hello")),
        NS2::MyClass (1986)
    {}
};

int main ()
{
    MyClass clazz;
    std::cout << typeid (NS1::MyClass).name () << std::endl;
    std::cout << typeid (NS2::MyClass).name () << std::endl;
    std::cout << typeid (clazz).name () << std::endl;
}


2 commentaires

Presque toutes étaient de bonnes réponses, mais celle-ci était la plus complète. Merci à tous!


Comment exécuter à l'aide de la syntaxe de constructeur dans ce cas?



0
votes

Personne n'a indiqué que ceci est la seule raison des raisons de noms de la raison. :)


1 commentaires

Ce n'est pas les espaces de noms de la raison .