Использование метода абстрактного класса - PullRequest
5 голосов
/ 27 марта 2010

можно ли использовать метод абстрактного класса? Как я могу использовать метод класса без экземпляра?

Ответы [ 2 ]

6 голосов
/ 27 марта 2010

Если вы объявляете метод как 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;
}

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

5 голосов
/ 27 марта 2010

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

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

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

...