2010-03-27 3 views

ответ

6

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

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

+0

большое вам спасибо – cemregoksu

5

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

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

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

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