Questo è il codice:Qual è una possibile soluzione alternativa per l'affettamento degli oggetti in C++?
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class A {
public:
virtual const string f() const { return "A"; }
};
class B : public A {
public:
const string f() const { return "B"; }
};
int main(int ac, char** av) {
vector<A> v;
v.push_back(B());
cout << v.at(0).f() << endl;
return 0;
}
risultato atteso è B
, ma è A
. Come ho capito oggetto slicing è in corso. Come evitarlo? Devo memorizzare i puntatori in vector
invece di istanze di oggetto? È questa l'unica scelta?
L'affettamento degli oggetti, sebbene avvenga qui, non è ciò che causa il risultato errato, è l'invocazione della funzione dall'operatore membro (.) Le funzioni virtuali devono essere richiamate con l'operatore membro-puntatore (->) (eccetto quando si usano i riferimenti) – Ozan
@Ozan: assurdità. Chiamare una funzione membro virtuale da un'altra funzione membro (virtuale o meno) comporterà anche una chiamata virtuale. – MSalters
Sì, volevo solo sottolineare a Vincenzo che l'utilizzo dell'operatore membro, non l'affettamento degli oggetti, era il colpevole. È un errore comune quando le persone java/C# scrivono C++ – Ozan