Какие типы членов я могу добавить в абстрактный класс С++

Здравствуйте, скажем, у меня есть абстрактный класс, который имеет несколько чистых абстрактных функций, и у меня есть несколько классов, производных от этого класса, и все данные из этих классов в конечном итоге становятся похожими, мне было интересно, будет ли разумно или даже возможно объявить вектор под защитой в абстрактном классе для сбора данных, так что-то вроде.

class A
{
protected:
    vector <string> str;
public:
    virtual function x();
    virtual function y(); //etc etc
    virtual ~A(){;}
};

class B : public A
{
public:
    function x();
    function y();
};

class C: public A
{
    //similar to class B
} ;

Мне трудно понять, как чистые виртуальные функции работают с С++, я понимаю полиморфизм, поскольку я сделал много проектов с ним в java. Можно ли вообще объявить и использовать этот вектор, поскольку абстрактный класс в С++ не может быть создан?


person user1314272    schedule 11.12.2012    source источник
comment
где чистые абстрактные функции?   -  person neagoegab    schedule 11.12.2012
comment
@neagoegab: Что такое чистые абстрактные функции?   -  person Lightness Races in Orbit    schedule 11.12.2012
comment
Очень возможно сделать интерфейс базовым классом в C++. Это зависит от вашего конкретного вкуса ООП, разрешено это или нет. Язык не волнует.   -  person Bo Persson    schedule 11.12.2012
comment
@LightnessRacesinOrbit, в стандарте C++ его не существует. Есть чисто виртуальная функция. Вот почему я хотел увидеть чистые абстрактные функции, нет... Я вру. В этом случае мы можем предположить, что чистая абстрактная функция является псевдонимом чистой виртуальной функции. :)   -  person neagoegab    schedule 11.12.2012
comment
@neagoegab: Хихи, хорошая попытка ;)   -  person Lightness Races in Orbit    schedule 11.12.2012


Ответы (4)


I was wondering if it would be wise or even possible to declare a vector under protected in the abstract class to collect the data.

Да, поднятие членов данных, совместно используемых несколькими производными типами, является законным выбором дизайна.

What type of members can I add in a c++ abstract class?

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

I am having difficulty understanding how pure virtual functions work with c++

Укажите виртуальную функцию как чистую, поместив = 0 в конце ее объявления. Вам не нужно указывать определение чистой виртуальной функции.

Вы не можете объявить экземпляр абстрактного базового класса; вы можете использовать его только как базовый класс при объявлении других классов.

person billz    schedule 11.12.2012

Чистые виртуальные функции-члены объявляются как

virtual <return-type> func(<parameters>) = 0;

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

Вы можете добавить любого участника в абстрактный класс в C++. Абстрактный класс — это обычный класс с одной или несколькими чистыми виртуальными функциями-членами.

person Olaf Dietsche    schedule 11.12.2012
comment
Виртуальные функции могут иметь реализацию; ваше определение ошибочно. - person Lightness Races in Orbit; 11.12.2012
comment
@LightnessRacesinOrbit Да, могут. Но чаще всего их нет. - person Olaf Dietsche; 11.12.2012
comment
Сейчас лучше. Чистые виртуальные функции не определяются отсутствием определения (смеется); они определяются спецификатором = 0 и тем фактом, что их full-object не являются экземплярами. (Кроме того, добавьте чистый в мой предыдущий комментарий, очевидно.) - person Lightness Races in Orbit; 11.12.2012

  1. Я не вижу здесь абстрактных классов
  2. Вы можете включать члены любых типов в абстрактный класс
person Community    schedule 11.12.2012
comment
Он имеет в виду родительский класс классов B и C, то есть класс A как абстрактный класс. - person Muhammad Maqsoodur Rehman; 11.12.2012

Более важно, чем что, это почему.

Абстрактный класс — это не просто «класс со всеми функциями, сделанными чисто виртуальными». Он представляет собой определенную идеологию объектно-ориентированного программирования. При использовании в качестве интерфейсов они не должны содержать состояния.

person Pavel Radzivilovsky    schedule 11.12.2012
comment
Это не достаточная причина для них, ИМО. - person Lightness Races in Orbit; 11.12.2012
comment
Ну, наличие состояния — это своего рода деталь реализации. Это противоречит тому, для чего используется абстрактный класс. Кроме того, интерфейсы с отслеживанием состояния немедленно приводят к проблемам виртуального наследования. - person Pavel Radzivilovsky; 12.12.2012
comment
Ничто из того, что вы сказали в своем ответе или в своем комментарии, не является неправильным. Однако язык не предписывает один конкретный шаблон ОО или даже любой шаблон ОО, поэтому они не должны быть, IMO, недействительными, если они не квалифицированы под X Опровержение идеологии ОО. - person Lightness Races in Orbit; 12.12.2012