Nous essayons de namespace les versions de notre API avec les espaces de noms, bien que nous avons pensé que nous allons recevoir quelques problèmes avec des fonctions virtuelles:C++ en utilisant les espaces de noms pour le versionnage peut causer des problèmes d'héritage avec les remplacements
namespace v1 {
class someParam {
public:
someParam() {};
virtual ~someParam() {};
};
class someClass {
public:
someClass() {};
virtual ~someClass() {};
virtual bool doSomething(someParam a);
};
bool someClass::doSomething(someParam a)
{
return true;
}
}
namespace v2 {
class someParam : public v1::someParam {
public:
bool doParamStuff();
};
bool someParam::doParamStuff()
{
return true;
}
}
// Type Aliasing for v2 API
using someClass = v1::someClass;
using someParam = v2::someParam;
// SOME OTHER PROGRAM
class plugin : public someClass
{
public:
plugin() {};
virtual ~plugin() {};
bool doSomething(someParam a) override;
};
Dans ce Dans un cas spécifique, nous créons l'extension de classes existantes pour permettre la compatibilité binaire. Bien, nous obtenons une erreur de compilation pour plugin :: doSomething en raison du mot-clé override car il ne surcharge pas someClass :: doSomething parce que:
plugin :: doSomething (v2 :: someParam) vs someClass :: doSomething (v1 :: someParam).
Y at-il un moyen de réparer le plugin sans utiliser explicitement v1 pour someParam dans la classe plugin? , Rien ne devrait idéalement se faire du côté du plug-in, et sans avoir à créer v2 :: someClass