Частное наследство или ограничение

У меня есть базовый класс с несколькими открытыми методами, и я хочу получить дочерний класс, который наследует только определенные функции, поэтому я получил дочерний класс с помощью частного наследования. Также я несколько раз сталкивался с vave (включая C ++ primer plus), что частное наследование почти в точности похоже на сдерживание. Теперь у меня есть проблема, когда я хочу использовать функцию, определенную в Base, которая будет доступна в производном классе.

Производный класс не имеет никаких закрытых членов в дополнение к тем, которые требуются базовым классом. Я не уверен, как определить публичный метод «func» для производного класса, как показано в коде.

class Base
{
private:
double *p;
public:
Base(int m, int n);
void fun(const Base & obj1, const Base & obj2)
};

class Derived : private Base
{
public:
Derived(int n) : Base(1,n) {}
void fun(const Derived & obj1,const Base & obj2)
{
/* The function fun in derived class works almost exactly
like fun in Base class but I don't know how to call
Base.Fun(...). Also all the data needed to perform
operations in this function is a part of the private
member of the base class which the Derived member can't
access.
*/
}
}

Если бы я использовал сдерживание, я мог бы просто определить следующее:

class Derived
{
private:
Base P;
public:
void fun(const Derived & obj1,const Base & obj2)
{
Base :: P.func(obj1.P,obj2);
}
};

Это заставляет меня задаться вопросом, является ли сдерживание более подходящим, чем частное наследование. С другой стороны, я не уверен, что любая из реализаций верна. Поэтому я ищу возможные способы сделать это.

Обратите внимание, что я не показывал конструкторы копирования, присваивания и операторы и некоторые другие методы в приведенных выше кодах, но я знаю об их требованиях. Коды предназначены только для того, чтобы служить основной целью демонстрации частного наследования и содержания.

-1

Решение

Если забавный метод Derived может быть реализован только путем прямого доступа к закрытым членам Base, ни наследование, ни ограничение не позволят Derived получить доступ к этим методам. Используя наследование, член должен либо быть защищенным (или общедоступным), либо должны быть добавлены защищенные (или общедоступные) методы получения / установки. Используя композицию, общедоступные методы получения / установки будут необходимы, чтобы избежать обнародования этих элементов данных.

В забавном методе Derived это:

Base::fun(obj1, obj2)

вызовет забавный метод класса Base.

1

Другие решения

Других решений пока нет …