чистая виртуальная функция с реализацией

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

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

void A::f() {
    cout<<"Test"<<endl;
}

Код выше OK?

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

161
задан Eight 2 June 2012 в 08:39
поделиться

7 ответов

Чистый виртуальный функция должен быть реализован в полученном типе, который будет непосредственно создан, однако базовый тип все еще может определять реализацию. Производное класс может явно позвонить в реализацию базового класса (если разрешать разрешения доступа), используя полноценное имя (вызывая A :: F () в своем примере - если A :: F () или защищены ). Что-то вроде:

class B : public A {

    virtual void f() {
        // class B doesn't have anything special to do for f()
        //  so we'll call A's

        // note that A's declaration of f() would have to be public 
        //  or protected to avoid a compile time problem

        A::f();
    }

};

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

Обратите внимание, что, хотя это разрешено языком, это не то, что я вижу обычно используемым (и тот факт, что можно сделать, кажется, удивляет большинство программистов C ++, даже опытных).

196
ответ дан 23 November 2019 в 21:25
поделиться

, чтобы быть понятным, вы не понимаете, что = 0; После виртуальной функции средства.

= 0 означает, что полученные классы должны обеспечивать реализацию, не в том, что базовый класс не может предоставить реализацию.

На практике, когда вы отмечаете виртуальную функцию в виде чистого (= 0), существует очень мало точки обеспечения определения, потому что он никогда не будет вызван, если кто-то явно не делает это через базу :: Функция (...) Или если конструктор базового класса вызывает рассматриваемую виртуальную функцию.

73
ответ дан 23 November 2019 в 21:25
поделиться

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

20
ответ дан 23 November 2019 в 21:25
поделиться

Вам придется дать тело чистому виртуальному деструктору, например:)

Чтение: http://cplusplus.co.il/2009/08/ 22 / Чистый виртуальный деструктор /

(Ссылка сломана, используйте архив)

5
ответ дан 23 November 2019 в 21:25
поделиться

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

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

Следовательно, одно разумное использование чистых виртуальных функций определяет чистый виртуальный деструктор как «не окончательное» ключевое слово.

Следующий код удивительно правильно правильно:

class Base {
public:
  virtual ~Base() = 0;
};

Base::~Base() {}

class Derived : public Base {};

int main() { 
  // Base b; -- compile error
  Derived d; 
}
17
ответ дан 23 November 2019 в 21:25
поделиться

Да, это правильно. В вашем примере классы, которые получают из наследства как интерфейса F (), так и для реализации по умолчанию. Но вы заставляете полученные классы для реализации метода f () (даже если это только для вызова реализации по умолчанию, предоставляемой A).

Скотт Мейерс обсуждает это в Эффективном C ++ (2-е издание) Пункт № 36 Дифференцировка между наследством интерфейса и наследования реализации. Номер товара, возможно, изменился в последнем издании.

4
ответ дан 23 November 2019 в 21:25
поделиться

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

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

4
ответ дан 23 November 2019 в 21:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: