У меня есть класс 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);
Но это на самом деле идет к ClassA
«s RuntimeClassInitialize
конструктор. ClassB
«s RuntimeClassInitialize
Путь к коду никогда не ударил.
Мне интересно, если это правильный способ расширения класса в WRL? Где я делаю неправильно в коде?
Вам нужны переопределенные методы, чтобы иметь то же самое подпись на обоих классах.
этот
HRESULT RuntimeClassInitialize(ParamsForClassA);
Не может быть отменено этим
HRESULT RuntimeClassInitialize(ParamsForClassB);
Потому что они принимают разные аргументы.
Это перегрузка, не переопределение.
(А такие перегрузки вызывают Сокрытие имени)