Два глупых вопроса, недающих мне покоя. Суть метода Static и Virtual?. На гугл не ссылайтесь, там всё на заумном.
(С++)
Методы объявления класса . типо static void class proga
virtual class
Статический метод создаётся один на все объекты класса и может обращаться только к статическим членам класса.
Если метод в базовом классе объявлен как виртуальный, то его можно переопределить в производных классах. При этом сигнатура метода остаётся неизменной, а реализация будет своя для каждого класса. Это полезно, если к объектам производных классов обращаются по ссылке или указателю на базовый класс. Вызовется именно реализация того класса, на который ссылается указатель или ссылка. Нужно для позднего связывания, когда на этапе компиляции ещё не известно, какого класса будет обрабатываемый объект.
Вообще то static не являются свойствами и/или методами класса
class ClassA
{
public:
int m_a;
static int s_b;
void Method();
static void Function();
};
m_a является переменной-членом класса (или свойством объекта) . Потому что она входит в состав объекта класса. Это "кусочек" объекта. Доставать его можно только через объект или функции-члены класса (или методы объекта) .
ClassA Var, *pVar;
Var.m_a;
pVar->m_a;
s_b не является перемнной-членом класса. Потому что она не входит в состав объекта. Она существует в единственном экземпляре, независимо от количества созданных объектов. По сути своей это глобальная переменная, помещенная в пространство имен класса. Про namespace имеет смысл почитать подробно. Но есть некоторые отличия от namespace. Пространства имен открытые. А для класса можно регулировать доступ к статической переменной с помощью директив public, protected, private; Доставать статическую переменную класса можно так же, как переменную из пространств имен (если позволяет доступ)
ClassA::s_b;
С функциями аналогично.
Method() Является функцией-членом. Его можно вызвать только через объект класса. Потому что в метод не явным оборазом передается указатель на объект (внутри метода указатель this как раз и есть тот самый указатель) , для которого вызывается метод. Назначение метода - совершать какие то действия с объектом класса. Значит метод должен знать, какой объект требует обработки.
ClassA Var, *pVar;
Var.Method();
pVar->Method();
Function() Не является функцией-членом класса (методом объекта) , ему указатель на объект не передается, поэтому работать с объектами он не может. Откуда он узнает какой объект нужно обрабатывать? По сути своей это глобальная функция, помещенная в пространство имен класса. Про доступ в пространство имен все остается как и прежде. Вызывать статическую функцию можно так же как и функцию из другого пространства имен (при наличии доступа) . Объект класса для этого не требуется.
ClassA::Function();
Думаю, что теперь понятно, чем отличаются переменные-члены и функции-члены, от статических переменных и функций класса.
Тепеть по методы (статика в это не входит) . Зачем изобрели виртуальные методы? Обычные методы работают прекрасно до тех пор, пока не возникает следущая ситуация: указатель на объект приводится к указателю на объект базового класса.
class ClassA
{
public:
void Method1();
virtual void Method2();
};
class ClassB: public ClassA
{
public:
void Method1();
virtual void Method2();
};
ClassA *pa = new ClassA;
ClassA *pb = new ClassB;
Здесь все правильно, указатель на объект класса ClassB может быть приведен указателю на объект базового (или родительского) класса. Но вот что будет делать объект, если через указатель вызвать какой то метод класса? Вернее метод какого класса будет вызван?
pa->Method1();
pa->Method2();
Здесь все однозначно, каков объект, таковы и методы
А вот с объектом ClassB будет рикокос
pb->Method1();
Поскольку указатель приведен к объекту ClassA, то и будет вызван метод класс ClassA. Но ведь объект класса ClassB, и мы хотим чтобы вызывался метод класса ClassB. Это недоразумение решается с помощью виртуальных функций
pb->Method2(); Здесь будет вызван метод класса ClassB, поскольку метод - виртуальный.
При этом "виртуальность" должна закладываться еще в базовом классе, а затем переноситься в производные классы.
class в C++ не имеет таких свойств, только методы.
Вы про C# говорите скорее всего.
Про void вообще молчу, такого нет ни в C++, ни в C#, ни вообще нигде. void - тип данных, класс не возвращает данные.
Либо в фразе "метод объявления класса" подразумевалось "метод класса".
Что с вами будет, когда дойдёте до mutable, template и reinterpret_cast, даже не представляю...
static - можно вызывать по имени класса (типа) , а не только через экземпляр класса.
virtual - при обращении к базовому классу вызывается метод не базового класса, а соответствующий (если он есть) по уровню классу-наследнику вызвавшего его метода.
Это про что? про CSS? Либо про другой язык программирования?