2009-09-21 10 views
1

J'ai quelque chose comme ça:C++ - clonage classe de base

Class Foo : Base {.."my stuph" ..}; 

int main() { 
    Base *b = new Base; 
    Foo f (b); <== **error** "invalid conversion from Base to Foo." 
    .. 
} 

Comment puis-je cloner b à f?
Dans "my stuph" j'ai des fonctions qui font l'entraînement entre Foo et Base.
Je ne peux pas changer beaucoup de Base tant qu'elle est écrite par d'autres.

Merci

+0

Pourquoi ne faites-vous pas: Foo * f = new Foo ;? –

+2

Base b = nouvelle base; regarde bizarre à moi – MadH

+0

Amendement: regarde * Java * à moi. –

Répondre

5

Vous ne pouvez pas créer automatiquement une classe dérivée à partir de la base. Vous pouvez faire vice versa et créer une classe de base à partir de la dérivée, cependant, et cela pourrait vous rendre confus.

Pour faire ce que vous voulez, vous devez ajouter constructeur propre à Foo et penser comment vous allez réellement créer des informations manquantes dans une instance Base pour constituer une instance Foo entièrement fonctionnelle.

Le constructeur peut ressembler à ceci:

Foo(Base const& b) : Base(b) 
{ /* construct info specific to Foo (absent in Bar) */ } 
+0

Merci, c'est une explication très claire. – name

4

Définir un constructeur qui prend un argument de type base:

Foo(const Base & b) 
: Base(b) // construct the base class, using its copy constructor 
{ 
    // plus, initialize Foo-specific member data here 
} 

BTW: Êtes-vous sûr de vouloir être la base d'une classe de base privée?

+4

Eh bien, si vous allez choisir des lentes, "êtes-vous sûr que le mot-clé' class' est en majuscule? ". "Etes-vous sûr que vous voulez que b soit affecté par tas?". "Es-tu sûr de pouvoir assigner le résultat de' new B' à une variable de type "B'?". Je crois que la réponse à toutes ces choses est "non" ;-) –

+0

Eh bien, j'ai raté ce mot-clé de classe est capitalisé. Quoi qu'il en soit, le compilateur s'en plaindrait donc je suis sûr que c'était une faute de frappe. Mais avoir une classe de base privée en omettant le spécificateur d'accès est tout à fait légal mais vraiment déroutant si ce n'est pas voulu, alors je voulais le signaler. –

+1

@tkopec: Le problème avec la question est que le code contient plus de fautes de frappe que toute autre chose. Tandis que tes conseils sont bons, je doute un peu que ce soit ce que veut Mariusz. Ce n'est pas une opération de clonage après tout. Mais alors - il semble être vague sur le concept de clonage de toute façon. – sbi

1

Fournit un constructeur qui prend une classe de base ou une référence à celui-ci.

1

Donnez Foo un constructeur qui prend un paramètre de base:

class Foo : public Base { 
public: 
    explicit Foo(const Base &b) { 
     // do work to initialise Foo. You might want to include 
     Base::operator=(b); 
     // or you might not. Depends how Foo works, and what Base's 
     // constructors do. 
    } 
}; 

Chaque fois que vous écrivez un constructeur unique argument, vous devriez considérer si oui ou non vous voulez spécifier « explicite ». "Explicite" est là pour dire que le constructeur ne devrait être utilisé que si vous avez explicitement écrit un appel de constructeur ou un cast. Si ce n'est pas là, alors le compilateur aussi « implicitement » convertir des objets de base de Foo, par exemple dans la situation suivante:

int doSomething(const Foo &f) { 
    return 23; 
} 

Base b; 
doSomething(b); // doesn't compile 
doSomething(static_cast<Foo>(b)); // does compile 

Si vous avez supprimé le « explicite », puis doSomething(b) serait compiler et faire la même chose en tant que deuxième ligne - construisez un objet Foo temporaire à partir de b, et passez-le à doSomething.

1

Une opération de clone est celui qui fournit une copie exacte d'un objet. La conversion de Base en Foo ne sera pas une opération de clonage.

Dans votre question, class est écrit avec une majuscule « C », Foo privé de dérive de base, il est membres (important pour cette question) ne sont pas représentés, Base b = new Base ne compilerait pas, et je ne sais pas quoi " séance d'entraînement entre Foo et Base "est censé signifier. S'il vous plaît prenez le temps de créer un exemple correct qui montre (seulement) le problème que vous avez et fournir des descriptions exactes de ce que vous voyez et de ce que vous attendez. Avec la question telle qu'elle est, je ne sais pas par où commencer pour vous dire ce que vous avez mal fait. Je vous suggère de changer votre question pour montrer du code qui compile (sauf pour le problème que vous avez).

Ensuite, je pourrais être en mesure de modifier cette réponse afin qu'elle explique ce qui se passe.

Questions connexes