C ++ Virtual / Pure Virtual объяснил - PullRequest
       34

C ++ Virtual / Pure Virtual объяснил

316 голосов
/ 20 августа 2009

Что именно это означает, если функция определена как виртуальная и совпадает ли она с чисто виртуальной?

Ответы [ 12 ]

0 голосов
/ 28 мая 2013

Чистая виртуальная функция

попробуйте этот код

#include <iostream>
using namespace std;
class aClassWithPureVirtualFunction
{

public:

    virtual void sayHellow()=0;

};

class anotherClass:aClassWithPureVirtualFunction
{

public:

    void sayHellow()
    {

        cout<<"hellow World";
    }

};
int main()
{
    //aClassWithPureVirtualFunction virtualObject;
    /*
     This not possible to create object of a class that contain pure virtual function
    */
    anotherClass object;
    object.sayHellow();
}

В классе anotherClass удалите функцию sayHellow и запустите код. вы получите ошибку! Потому что, когда класс содержит чисто виртуальную функцию, из этого класса невозможно создать объект, и он наследуется, тогда его производный класс должен реализовать эту функцию.

Виртуальная функция

попробуйте другой код

#include <iostream>
using namespace std;
class aClassWithPureVirtualFunction
{

public:

    virtual void sayHellow()
    {
        cout<<"from base\n";
    }

};

class anotherClass:public aClassWithPureVirtualFunction
{

public:

    void sayHellow()
    {

        cout<<"from derived \n";
    }

};
int main()
{
    aClassWithPureVirtualFunction *baseObject=new aClassWithPureVirtualFunction;
    baseObject->sayHellow();///call base one

    baseObject=new anotherClass;
    baseObject->sayHellow();////call the derived one!

}

Здесь функция sayHellow помечена как виртуальная в базовом классе. Это скажет компилятор, который пытается найти функцию в производном классе и реализовать функцию. Если она не найдена, выполнить базовую. Спасибо

0 голосов
/ 09 декабря 2012
  • Виртуальные функции должны иметь определение в базовом классе, а также в производном классе, но не обязательно, например, функция ToString () или toString () является виртуальной, чтобы вы могли предоставить собственную реализацию, переопределив ее в определенный класс (ы).

  • Виртуальные функции объявлены и определены в обычном классе.

  • Чистая виртуальная функция должна быть объявлена ​​с окончанием "= 0", и она может быть объявлена ​​только в абстрактном классе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...