Подтвердить что ты не робот

Частые члены абстрактного базового класса С++

Просто хотел уточнить. Должны ли абстрактные базовые классы никогда не иметь частных членов? Например

class abc{
public:
  virtual void foo()=0;
private:
  int myInt;
}

вы никогда не сможете получить доступ к myInt, так как вы не можете создать экземпляр abc, и он не будет в производном классе, поскольку он является закрытым. Есть ли ситуация, когда вы бы использовали частных членов в абстрактных базовых классах или это просто неправильно?

4b9b3361

Ответ 1

В С++ вы можете иметь абстрактный класс с нечистыми виртуальными методами. В этом случае, и в зависимости от дизайна, имеет смысл иметь частных членов:

class base {
   std::string name;
public:
   base( std::string const & n ) : name(n) {}
   std::string const & getName() const { return name; }

   virtual void foo() = 0;
};

Этот код гарантирует, что каждый объект, получаемый из базы, имеет имя, которое задается во время построения и никогда не изменяется в течение всего жизненного цикла объекта.

РЕДАКТИРОВАТЬ: для завершения после того, как Чарльз Бейли напомнил мне об этом в своем ответе

Вы также можете определить чисто виртуальные функции, и в этом случае частные атрибуты также могут иметь смысл:

// with the above definition of base
void base::foo() {
   std::cout << "My name is " << name << std::endl;
}

Ответ 2

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

Например:

class abc{
public:
  virtual void foo()=0;
private:
  int myInt;
};

class xyz : public abc
{
    virtual void foo();
};

#include <iostream>
#include <ostream>

void xyz::foo()
{
    std::cout << "xyz::foo()\n";
    abc::foo();
}

void abc::foo()
{
    std::cout << "abc::foo(): " << myInt++ << '\n';
}

#include <memory>

int main()
{
    std::auto_ptr<abc> p( new xyz() ); // value-initialization important
    p->foo();
    p->foo();
}

Вывод:

xyz::foo()
abc::foo(): 0
xyz::foo()
abc::foo(): 1

Ответ 3

Не все методы в абстрактном базовом классе должны быть чистыми виртуальными. У вас могут быть некоторые методы, которые полезны для всех подклассов. Таким образом, если у вас есть некоторые функциональные возможности в базовом классе, который модифицирует внутреннее состояние, у вас будут частные члены для них.

Ответ 5

В его нынешнем виде ваш пример не имеет смысла.

Тем не менее, абстрактным базовым классам разрешено иметь определения функций-членов, которым, в свою очередь, разрешается доступ к частным данным элемента в базовом классе.

Ответ 6

Вы можете получить доступ к отдельным членам через этот ярлык

Код находится в PHP

abstract class myclass1 
{ 
           private $var="46789";
       public function test($valuetoset)
       {
            echo $this->var = $valuetoset;

       } 
} 

class myclass2 extends myclass1
{ 


} 

$obj = new myclass2();
$obj->test(78);