Частые члены абстрактного базового класса С++
Просто хотел уточнить.
Должны ли абстрактные базовые классы никогда не иметь частных членов? Например
class abc{
public:
virtual void foo()=0;
private:
int myInt;
}
вы никогда не сможете получить доступ к myInt, так как вы не можете создать экземпляр abc, и он не будет в производном классе, поскольку он является закрытым.
Есть ли ситуация, когда вы бы использовали частных членов в абстрактных базовых классах или это просто неправильно?
Ответы
Ответ 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
Не все методы в абстрактном базовом классе должны быть чистыми виртуальными. У вас могут быть некоторые методы, которые полезны для всех подклассов. Таким образом, если у вас есть некоторые функциональные возможности в базовом классе, который модифицирует внутреннее состояние, у вас будут частные члены для них.
Ответ 4
Если вы используете шаблон шаблон шаблона метода (для реализации open/закрытый принцип), обычно существует private
членов абстрактного базового класса.
Ответ 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);