Функция переопределяет виртуальную функцию базового класса на основе имени и типов параметров (см. ниже). Поэтому ваш класс C
имеет две виртуальные функции foo
, один из которых унаследован от каждого A
и B
. Но функция void C::foo()
переопределяет как :
[class.virtual] / 2
Если объявлена функция виртуального члена
blockquote>vf
в классеBase
и в классеDerived
, прямо или косвенно полученном изBase
, членной функцииvf
с тем же именем, parameter-type-list , cv-qualification , и ref-qualifier (или отсутствие такого же), что иBase::vf
, тогдаDerived::vf
также является виртуальным (независимо от того, объявлен он или нет), и он переопределяетBase::vf
.Как я уже сказал в комментариях, [dcl.meaning] / 1 запрещает использование квалифицированного id в объявлении функции (члена):
Когда идентификатор declarator-id квалифицирован, объявление должно ссылаться на ранее объявленный член класса или пространства имен, к которому относится определитель [...] "
blockquote>Поэтому любой
virtual void X::foo();
является незаконным как объявление внутриC
.Код
class C : public A, public B { virtual void foo(); };
- единственный способ, которым AFAIK переопределить
foo
, и это будет переопределите оба параметраA::foo
иB::foo
. Невозможно иметь два разных переопределения дляA::foo
иB::foo
с другим поведением, отличным от введения другого слоя наследования:#include <iostream> struct A { virtual void foo() = 0; }; struct B { virtual void foo() = 0; }; struct CA : A { virtual void foo() { std::cout << "A" << std::endl; } }; struct CB : B { virtual void foo() { std::cout << "B" << std::endl; } }; struct C : CA, CB {}; int main() { C c; //c.foo(); // ambiguous A& a = c; a.foo(); B& b = c; b.foo(); }
Подавляющее большинство функций маршрутизации / направления используют онлайн-сервис для части маршрутизации, PWA или нет.
Автономная часть карты не проста, но гораздо более выполнима, скорее всего, скорее как собственное или гибридное мобильное приложение, чем как PWA с ограниченным объемом памяти.
Удачи!