c ++ абстрактный базовый класс закрытые члены - PullRequest
12 голосов
/ 06 апреля 2011

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

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

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

Ответы [ 6 ]

14 голосов
/ 06 апреля 2011

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

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 голосов
/ 06 апреля 2011

Обычно не рекомендуется иметь члены данных в абстрактном классе, но в вашем примере нет ничего технически неправильного.В реализации 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
1 голос
/ 06 апреля 2011

Если вы используете шаблон проектирования Template Method (для реализации открытого / закрытого принципа ), довольно часто в private входят члены абстрактного базового класса.

1 голос
/ 06 апреля 2011

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

0 голосов
/ 08 июля 2011

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

Код в 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);
0 голосов
/ 06 апреля 2011

Ваш пример не имеет смысла.

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

...