Site Tools


virtual

Виртуальная функция(метор) могут быть переназначены в унаследовавших их классах. Иначе, без virtual, эти методы нельзя будет перенозначить.

virtual void doSome();

Чистая виртуальная (pure virtual) иногда подразумевают “интерфейс”, означает, что функция обязана быть переназначена в унаследовавших их классах.

virtual void doSome() = 0;

Виртуальный деструктор при использование интерфейса

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

class Base
{
public:
    virtual ~Base()
    {
        std::cout << "Hello from ~Base()" << std::endl;
    }
};

class Derived : public Base
{
public:
    virtual ~Derived()
    {
        // Здесь могла бы быть очистка ресурсов
        std::cout << "Hello from ~Derived()" << std::endl;
    }
};

Base *obj = new Derived(); // если интерфейс не использовался, то деструктор Derived вызвался бы в любом случае.
delete obj;

вывод:

Hello from ~Derived()
Hello from ~Base()

без virtual ~Base(), деструктор ~Derived() не вызвался бы.

виртуальный базовый класс (виртуальное наследование)

При множественном наследие (наследие нескольких классов одновременно), позволяет избежать неопределенности:

  class base {
      public:
      int i;
  };
  
  // d1 наследует base как virtual
  class d1 : virtual public base {
      public:
      int j;
  };
  
  // d2 наследует base как virtual
  class d2 : virtual public base {
      public:
      int k;
  };
  
  /* d3 наследует как d1 так и d2. Тем не менее в d3 имеется только одна копия base! */
  class d3 : public d1, public d2 {
      public:
      int m;
  };
  
  int main(){
      d3 d;
      d.i = 11; // тут была бы неопределенность и ошибка, если бы d2 и d1 наследовали base не виртуально.
      d.j = 20;
      d.k = 30;
      d.m = 40;
      cout << d.i << " ";
      cout << d.j << " " << d.k << " ";
      cout << d.m << endl;
      return 0;
  }

вывод

  11 20 30 40
You could leave a comment if you were logged in.
virtual.txt · Last modified: 2013/04/09 14:26 by konovalov

Page Tools