С++ Расширить класс компонентов Windows WRL не работает

У меня есть интерфейс реализации класса ClassA IFooBar, как показано ниже.

class ClassA : public Microsoft::WRL::RuntimeClass<IFooBar>
{
public:
    virtual HRESULT RuntimeClassInitialize(ParamsForClassA);
}

Теперь я хочу написать встроенную ClassB функцию ClassA и переопределить ее функцию RuntimeClassInitialize, как показано ниже:

class ClassB : public ClassA
{
public:
    HRESULT RuntimeClassInitialize(ParamsForClassB)
    {
        // implementation goes here
    }
}

И я создаю указатель на объект ClassB следующим образом:

ComPtr<ClassB> ptr;
HRESULT hr = MakeAndInitialize<ClassB>(&ptr, ParamsForClassB);

Но на самом деле это относится к конструктору RuntimeClassInitialize ClassA. Путь кода RuntimeClassInitialize ClassB никогда не срабатывает.

Мне интересно, правильный ли это способ расширения класса в WRL? Где я ошибаюсь в коде?


person Allan Jiang    schedule 08.08.2014    source источник
comment
если аргументы разные, у вас будет 2 функции-члена с именем RuntimeClassInitialize. Тот, что из B, не заменит тот, что из A.   -  person cppguy    schedule 09.08.2014
comment
@cppguy ClassA и ClassB принимают разное количество паргументов. Но я передаю правильные аргументы функции MakeAndInitialize ClassB. Волшебным образом он переходит в класс А в результате...   -  person Allan Jiang    schedule 09.08.2014
comment
@AllanJiang Вы все еще видите эту проблему? На моей машине нормально.   -  person Eric Z    schedule 12.08.2014


Ответы (1)


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

это

HRESULT RuntimeClassInitialize(ParamsForClassA);

Не может быть переопределен этим

HRESULT RuntimeClassInitialize(ParamsForClassB);

Потому что они принимают разные аргументы.
Это перегрузка, а не переопределение. (И такие перегрузки вызывают скрытие имени)

Информацию о подписях можно найти здесь или здесь.

person Arnon Zilca    schedule 12.08.2014