Non, car cela n'a pas vraiment de sens. Rappelez-vous qu'une sous-classe contient tous les membres de sa classe parente; par conséquent, B
a toujours std::string key
. En outre, depuis B
std::string key
est le même type, c'est absolument identique à A
- alors quel était le point de l'annuler?
Notez également que lors de la construction, lorsque nous exécutons le constructeur A
, les méthodes virtuelles B
ne seront pas appelées. Cela signifie que si nous accédons à key
pendant la construction de A
, nous obtiendrons la clé de A
- mais lorsque B
sera construit, cela signifiera que key
sera ombrée, ses données étant totalement inaccessibles.
Cela dit, si vous voulez vraiment faire quelque chose comme ça, pour une raison quelconque, vous aurez besoin d'utiliser une fonction accesseur virtuelle:
class A {
private:
std::string m_key;
public:
virtual std::string &key() { return m_key; }
virtual const std::string &key() const { return m_key; }
};
class B : public A {
private:
std::string m_key;
public:
virtual std::string &key() { return m_key; }
virtual const std::string &key() const { return m_key; }
};
int main()
{
B b;
b.key() = "Foo";
return 0;
}
Le comportement que vous recherchez n'est pas clair. Il serait utile si vous ajoutez plus de code dans la fonction main() expliquant le comportement que vous recherchez. Non, cela n'a pas de sens de rendre un membre de données virtuel. – zumalifeguard