I have a class "SuperBase" with public methods and a class "Base", that derives from SuperBase, also with public methods. I cannot alter these, as they come from an external project.
I want my own class "Derived" to inherit privately from Base, but still keep SuperBase public.
External Code (cannot be changed):
class SuperBase
{
public:
   void printSuperBase() const
   {
      std::cout << "Super Base Class\n";
   }
};
class Base : public SuperBase
{
public:
   void print() const
   {
      std::cout << "Base Class\n";
   }
};
My own code (can be changed):
class Derived: private Base
{
public:
   void print() const
   {
      std::cout << "Derived Class\n";
   }
};
void function(SuperBase const& sb)
{
   sb.printSuperBase();
}
int main() 
{
   Derived D{};
   D.print();    //prints "Derived Class\n"
   function(D);  //cannot access SuperBase, as Base was included privately
}
Note that I cannot override any of the Base class methods, as they are not declared virtual.
Including both, Base and SuperBase does not work as this makes SuperBase ambiguous.
class Derived: private Base, public SuperBase
{
public:
   void print() const
   {
      std::cout << "Derived Class\n";
   }
};
void function(SuperBase const& sb)
{
   sb.printSuperBase();
}
int main() 
{
   Derived D{};
   D.print();    //prints "Derived Class\n"
   function(D);  //base class SuperBase is ambiguous
}
Including Base publicly and declaring it's methods as private does not work either, as I now can pass Derived to functions using Base, that can access all privately declared methods
class Derived: public Base
{
public:
   void print() const
   {
      std::cout << "Derived Class\n";
   }
private:
   using Base::print; //declare base method private to make it inaccessible
};
void function2(Base const& b)
{
   b.print();          //prints "Base Class\n", but shall be inaccessible instead.
   b.printSuperBase();
}
int main() 
{
   Derived D{};
   D.print();    //prints "Derived Class\n"
   function2(D); //D gets passed as Base class, but shall not be allowed
}
Aucun commentaire:
Enregistrer un commentaire