Функция с тем же именем, но другой подписью в производном классе

Как указано в комментариях, вы можете запустить процесс iexplore.exe для запуска приложения ClickOnce без какой-либо зависимости от браузера по умолчанию. Вы также можете запустить приложение ClickOnce так же, как Windows Explorer запускает его, используя dfshim.dll.

Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + ApplicationURL);

Есть несколько других статей в Интернете, в которых обсуждается использование этой стратегии, но я не нашел никаких официальных docshim.dll, shOpenVerbApplication.

  • Другой вопрос о переполнении стека упоминает использование пользовательского .exe для установки .NET Framework, а затем запускает приложение ClickOnce через ShOpenVerbApplication.
  • Scott Hanselman обсуждает ShOpenVerbApplication как сопоставление файлов по умолчанию для файлов с типом MIME приложения / x-ms-application в сообщении об Firefox и ClickOnce.

Обновить

Как упоминается в другом вопросе о переполнении стека, вы также можете использовать команду dfshim.dll LaunchApplication, которая задокументирована на сайте Microsoft . Однако эта команда недоступна в некоторых старых версиях .NET Framework.

83
задан YSC 4 January 2016 в 13:30
поделиться

2 ответа

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

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

, Если необходимо вызвать основную функцию, необходимо будет определить объем вызова при помощи A::foo(s). Обратите внимание, что это также отключило бы любой механизм виртуальной функции для A::foo(string) одновременно.

72
ответ дан CB Bailey 24 November 2019 в 08:50
поделиться

Это - потому что поиск имени останавливается, если это находит имя в одной из Ваших баз. Это не на время забудет в других основаниях. Функция в B тени функция в A. Необходимо повторно объявить функцию в пределах B, так, чтобы обе функции были видимы из B и C:

class A
{
    public:
    void foo(string s){};
};

class B : public A
{
    public:
    int foo(int i){};
    using A::foo;
};

class C : public B
{
    public:
    void bar()
    {
        string s;
        foo(s);
    }
};

Редактирование: реальное описание, которое дает Стандарт, (от 10.2/2):

следующие шаги определяют результат поиска имени в объеме класса, C. Во-первых, каждое объявление для имени в классе и в каждом из его подобъектов базового класса рассматривают. Имя элемента f в одном под - возражает, что B скрывает имя элемента f в подобъекте, если A является подобъектом базового класса B. Любые объявления, которые так скрыты, устраняются из соображения. Каждое из этих объявлений, которое было представлено объявлением использования, считается от каждого подобъекта C, который имеет тип, содержащий declara-tion обозначен использованием-declaration.96), Если получающийся набор объявлений не все от подобъектов того же типа, или набор имеет нестатического участника и включает участников от отличных подобъектов, существует неоднозначность, и программа плохо формируется. Иначе тот набор является результатом поиска.

Это имеет следующее для высказывания в другом месте (чуть выше его):

Для идентификационного выражения [ что-то как "нечто" ], поиск имени начинается в объеме класса этого; для квалифицированного идентификатора [ что-то как "A:: нечто", A является nested-name-specifier], поиск имени, начинается в пределах nested-name-specifier. Поиск имени происходит перед управлением доступом (3.4, пункт 11).

([...] помещенный мной). Обратите внимание, что означает, что, даже если Ваше нечто в B является частным, нечто в A все еще не будет найдено (потому что управление доступом происходит позже).

103
ответ дан Johannes Schaub - litb 24 November 2019 в 08:50
поделиться
Другие вопросы по тегам:

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