Форум: Форум C++Разное
Новые темы: 00
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Реализация чисто виртуального метода абстрактного класса
 
 автор: rty   (01.04.2007 в 13:58)   письмо автору
 
 


class T
{
public:
  virtual void print() = 0;
};


Возможно ли такое обьявление:

void T::print()
{
  cout << "12345";
}


если нет, то почему нельзя

  Ответить  
 
 автор: cheops   (01.04.2007 в 14:35)   письмо автору
 
   для: rty   (01.04.2007 в 13:58)
 

Можно... Не смотря на то, что класс абстрактный, следовательно, объект данного класса объявить нельзя, а в классах-наследниках придётся перегрузить метод print(), так как он виртуальный, обратиться к виртуальному методу print() класса T всё же можно
#include <iostream>
using namespace std;

class T
{
public:
  virtual void print() = 0;
};
void T::print()
{
  cout << "12345";
}

class B:T
{
  public:
    void print();
};
void B::print()
{
  T::print();
}

int main()
{
  B obj;
  obj.print();
  return 0;
}

Однако перегружать метод в производном классе всё равно придётся.

  Ответить  
 
 автор: rty   (01.04.2007 в 14:39)   письмо автору
 
   для: cheops   (01.04.2007 в 14:35)
 

если можно, то почему в книгах пишут что у функции нет тело

  Ответить  
 
 автор: cheops   (01.04.2007 в 14:54)   письмо автору
 
   для: rty   (01.04.2007 в 14:39)
 

Если тела не реализовывать, то не будет :))) правда объявление прототипа без реалзации возможно не только для виртуальных функций, но и вообще для всех функций программы. Задача чисто виртуального метода - потребовать переопределение метода в производном классе (например, в Java, PHP для этого используются интерфейсы)...
Приведённый выше пример, является демонстрацией того, как не следует поступать - так как мы при помощи "хитрости" просто пытаемся (не до конца) из чисто-виртуальной функции сделать просто виртуальную функцию. Такой "хитрый" код является признаком плохо тона. Да возможно (специально проверил в Builder, VC++ и GCC), но лучше так не поступать. Традиционно для чисто виртуальных методов в базовом классе не определяют реализации вообще, а реализуют их в производных классах.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования