действительно ли возможно использовать метод абстрактного класса? как я могу использовать метод класса, не имея экземпляра?
Если вы объявляете метод как static
, вы можете вызывать его напрямую, не требуя экземпляра класса. В противном случае вам понадобится экземпляр производного класса.
Поскольку абстрактный класс не может быть создан напрямую, вы не можете вызвать метод абстрактного класса напрямую , если это не статический метод. Но вы можете вызвать статический метод абстрактного класса напрямую, вот краткий пример:
#include <iostream>
#include <ostream>
#include <fstream>
using namespace std;
class stest{
public:
static void test();
virtual void a() = 0;
};
void stest::test(){ cout << "test\n"; }
int main(){
stest::test();
return 0;
}
В качестве альтернативы, если у вас есть экземпляр класса, производный от абстрактного класса, вы можете рассматривать его как экземпляр абстрактного class, и может вызывать для него любые методы.
Абстрактный класс не означает, что у вас нет экземпляра, это означает, что тип среды выполнения экземпляра фактически некоторый производный класс, который предоставляет реализации для чистых виртуальных функций в абстрактном базовом классе. Но не все функции-члены абстрактного класса должны быть чисто виртуальными, у вас может быть сочетание конкретных и абстрактных функций.
Когда вы вызываете функции-члены «абстрактного класса», все виртуальные функции, включая чисто виртуальные, вызываются полиморфно. Таким образом выполняется переопределение, определенное в производном классе. Невиртуальные функции вызывают определение в базовом классе, у вас не может быть чистых конкретных функций, поэтому даже абстрактный класс должен обеспечивать реализацию не виртуальных функций.
Реализация чистой виртуальной функции может быть предоставлена абстрактным базовым классом. По-прежнему необходимо предоставить переопределение, но тогда переопределение может вызвать реализацию базового класса.