Вывод класса из абстрактного класса (C ++) - PullRequest
2 голосов
/ 27 марта 2010

У меня есть абстрактный класс с чисто виртуальной функцией f () и я хочу создать класс, унаследованный от этого класса, а также переопределить функцию f (). Я разделил заголовочный файл и файл cpp. Я объявил функцию f (int) в заголовочном файле, а определение находится в файле cpp. Тем не менее, компилятор говорит, что производный класс все еще абстрактный. Как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 27 марта 2010

Функции f () и f (int) не имеют одинаковую сигнатуру, поэтому вторая не обеспечит реализацию первой. Подписи PVF и реализации должны точно совпадать.

1 голос
/ 27 марта 2010

Вы объявляете f (int) в своем базовом классе как чисто виртуальный или f ()?

Чистые виртуальные функции могут иметь определения внутри своего базового класса. Чистая виртуальная функция просто говорит, что производный тип должен также указывать свои собственные реализации функции f (int).

class Base
{
public:
  virtual void f(int) = 0;
}


Base::f(int)
{
//some code 
}


class Derived : public Base
{
public:
  virtual void f(int)
  {//Implementation is needed in Derived since f(int) is pure virtual
  }
}
0 голосов
/ 03 апреля 2010

Как насчет использования шаблонов C ++?

template<typename T>
 class Basic{
  public:
   void f(T);
};

template<typename T>
 Basic<T>::f(T t){
   //Do something generic here
 }

Вы можете использовать специализацию шаблона, если вашей функции f нужно сделать что-то еще, когда ее параметр имеет определенный тип. Я буду использовать строку в этом примере.

template<>
 class Basic<string>{
  public:
   void f(string);
};

template<>
 Basic<string>::f(string t){
   //Do your special thing with a string
}

Надеюсь, это поможет!

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