2009-08-19 4 views
13

Можем ли мы написать абстрактное ключевое слово в классе C++?Могу ли я использовать ключевое слово abstract в классе C++

+23

Конечно, мы можем это сделать. К сожалению, код не будет компилироваться, хотя =) – SadSido

+0

Что относительно абстрактного ключевого слова в Visual C++ (специфический для Micrsoft). Это не стандартное, или хорошо реализовано, на мой взгляд, но оно считается, не так ли? : P – user965369

+0

В дополнение к чистым виртуальным функциям в C++ я отмечаю абстрактные классы с «A_» как префикс имени класса на любом языке, например. "A_MyAbstractClass". Я лично считаю это весьма полезным. –

ответ

17

Нет, C++ не имеет абстрактного текста. Однако вы можете написать pure virtual functions; это C++ способ выражения абстрактных классов.

35

Номер

Чистые виртуальные функции, в C++, объявляются как:

class X 
{ 
    public: 
     virtual void foo() = 0; 
}; 

Любой класс, имеющий по меньшей мере один из них считается абстрактным.

+3

Отсутствует тип возврата. Также метод должен быть виртуальным. – Naveen

+1

Абсолютно верно, спасибо. Человек, я должен получить голову от обслуживания кода и писать новый код раз в то время - он растворяет ваш мозг, только глядя на ошибки других людей. :-D – DevSolar

5

Это ключевое слово, введенное как часть языка C++/CLI для платформы .NET.

+4

... который не C++. Серьезно, ref, это посягательство ... – DevSolar

+5

Технически это расширение Microsoft C++ для собственного кода, даже если вы не нацеливаете .NET, поэтому это не C++/CLI. Просто расширение, такое же, как '__interface' или' __declspec (свойство) '. Все-таки не ISO C++, конечно. –

+1

Нет downvotes, но C++ подразумевает стандартный C++. Любая нестандартная реализация XYZ должна быть явно указана, и пока такая спецификация не будет сделана, нет оснований признавать ее существование. – lorefnon

4

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

Вот хорошая ссылка cplusplus.com

0

Там нет ключевого слова «абстрактного», но чисто виртуальная функции превращает класс в абстрактный класс, который можно расширить и повторно использовать в качестве интерфейса.

1

Как отмечают другие, если вы добавите чистую виртуальную функцию, класс станет абстрактным.

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

Пример:

class Base 
{ 
protected: 
    Base() 
    { 
    } 

public: 
    void foo() 
    { 
    } 

    void bar() 
    { 
    } 
}; 

class Child : public Base 
{ 
public: 
    Child() 
    { 
    } 
}; 
2

на самом деле ключевое слово abstract существует в C++ (VS2010 по крайней мере), и я нашел, что это может быть использовано, чтобы объявить класс /-структуру, как не-экземпляр. не

struct X abstract { 
    static int a; 
    static void foX(){}; 
}; 
int X::a = 0; 
struct Y abstract : X { // something static 
}; 
struct Z : X { // regular class 
}; 
int main() { 
    X::foX(); 
    Z Zobj; 
    X Xobj; // error C3622 
} 

MSDN: https://msdn.microsoft.com/en-us/library/b0z6b513%28v=vs.110%29.aspx

+0

'abstract' не является частью стандарта C++. – smerlin

+0

Нестандартный, но поскольку это нефункциональная проверка здравомыслия, его легко фиксировать условным '# define' на других компиляторах в соответствии с ответом Кена. –

+0

@cz Что делает '#define abstract'? –

0

нет, вы не можете использовать абстрактные в качестве ключевого слова .because нет какого-либо абстрактное слово ключ доступен в C++.

Если вы хотите сделать класс в виде абстракции C++, вы можете объявить хотя бы одну функцию как чистую виртуальную функцию.

, но в производном классе вы должны предоставить определение else, чтобы оно выдало ошибку компиляции.

EX:

class A 
{ 

public : 

    virtual void sum()=0; 

}; 

примечание:

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

0

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

класс SomeClass { общественный: виртуальный void pure_virtual() = 0; // чистая виртуальная функция

};

Смежные вопросы