2010-02-28 5 views
3

Supposons que j'ai:C++ Comment attribuer/récupérer une classe de base?

class Foo { 
    ... 
}; 
class Bar : public Foo { 
    ... 
}; 
Foo foo; 
Bar bar; 

est-il de toute façon de faire ce qui suit:

foo_part_of_bar(bar) = foo; 

foo = foo_part_of_bar(bar); 

?

Merci!

+0

Où est la classe de base? Je ne peux voir que 2 classes indépendantes. – kennytm

+0

Voulez-vous dire 'class Bar: public Foo'? –

+0

@Kenny, Samuel: fixe – anon

Répondre

3

En supposant que vous vouliez dire class Bar : public Foo, ce qui suit devrait fonctionner.

Pour foo_part_of_bar(bar) = foo;

*(static_cast<Foo *>(&bar)) = foo; 

Pour foo = foo_part_of_bar(bar);

foo = bar; 
+1

Pourquoi pas 'static_cast (bar)'? –

+0

Cela suppose que Foo possède l'opérateur d'affectation par défaut/copie ctor. Si les deux appellent des fonctions virtuelles sur la source, je ne pense pas qu'il soit possible de copier la partie Foo de la barre vers un autre Foo. –

2

Apparemment, vous voulez dire que Bar est un descendant de Foo dans la hiérarchie des classes ...

Dans ce cas, faire la première partie peut se faire de deux manières différentes

// foo_part_of_bar(bar) = foo; 
bar.Foo::operator =(foo); 
(Foo &) bar = foo; // or use a C++-style cast 

(Ce dernier peut se conduire mal dans le cas exotique lorsque le operator = correspondant est déclaré virtuel et remplacé dans Bar Mais c'est, comme je l'ai dit, exotique.)

Pour la deuxième partie, vous ne devez pas eally besoin de faire des efforts particuliers

// foo = foo_part_of_bar(bar); 
foo = bar; 
// This is called slicing 

Tous les deux ont un usage très limité dans certains contextes très particuliers. Je me demande ce que vous en avez besoin pour ...

1
#include <iostream> 

struct Foo { 
    Foo& operator=(const Foo&) 
    { 
     std::cout << "Foo::operator=\n"; 
     return *this; 
    } 
}; 
struct Bar : public Foo { 
    Bar& operator=(const Bar&) 
    { 
     std::cout << "Bar::operator=\n"; 
     return *this; 
    } 
}; 

int main() 
{ 
    Foo foo; 
    Bar bar; 

    Foo& foobar = bar; 
    foobar = foo; 

    foo = bar; 

    return 0; 
} 
Questions connexes