Переопределение функции C++

Низкотехнологичный подход: делать это с помощью SQL может быть излишним. В соответствии с вашим вопросом вам просто нужно сделать однократную проверку импорта.

Почему бы просто не сделать: SELECT * FROM ImportTable

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

19
задан Mizipzor 22 June 2009 в 15:06
поделиться

6 ответов

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

  • С BaseA , он будет компилироваться и выполняться, как задумано, при этом foo () является виртуальным и выполняется в классе Child .
  • То же самое с BaseB , это также будет компилироваться и выполняться по назначению, причем foo () является виртуальным () и выполняется в классе Child .
  • Однако с BaseC он будет компилироваться и выполнить, но он выполнит версию BaseC , если вы вызовете ее из контекста BaseC , и версию Child , если вы вызовете в контексте Ребенок .
14
ответ дан 30 November 2019 в 03:43
поделиться

В BaseA дочерний класс не компиляция, чистая виртуальная функция не определено

Это верно, только если вы пытаетесь создать объект BaseA. Если вы создаете объект Child, а затем можете вызвать foo (), используя BaseA * или Child *

С BaseB функция в дочернем вызывается при вызове foo на BaseB * или Child *.

Зависит от типа объекта, поскольку объект может быть BaseB или Child. Если объект - BaseB, то вызывается BaseB :: foo.

Благодаря BaseC функция ребенка вызывается при вызове foo для Child * но не на BaseB * (функция в вызывается родительский класс).

Да, но вы никогда не захотите этого делать.

2
ответ дан 30 November 2019 в 03:43
поделиться

Важное правило, о котором следует помнить, - как только функция объявляется виртуальной, функции с сопоставлением подписи в производных классах всегда виртуальны. Таким образом, она переопределяется для Child of A и Child of B, которые будут вести себя идентично (за исключением того, что вы не можете напрямую создать экземпляр BaseA).

Однако в C функция не переопределяется, а перегружается. В этой ситуации имеет значение только статический тип: он будет вызывать его на указателе (статический тип), а не на том, чем на самом деле является объект (динамический тип)

16
ответ дан 30 November 2019 в 03:43
поделиться

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

2
ответ дан 30 November 2019 в 03:43
поделиться

Это в основном зависит от того, как вы его назвали.

если вы это сделали:

class Child : public BaseA
{
public:
    int foo() { return 42; }
};

и сделали

BaseA baseA = new Child();
baseA->foo();

Это вызвало бы функцию foo Child.

Однако, если вы сделали следующее:

BaseA baseA = new BaseA();

Это приведет к ошибке времени компиляции.

1
ответ дан 30 November 2019 в 03:43
поделиться

Дочерний класс будет компилироваться, если он унаследован от A, вы просто не можете создавать экземпляры объектов этого типа.

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

0
ответ дан 30 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

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