Как использовать AddMetrics в Asp.net Core

Как многие из парней отметили, что это законно.

Однако, часть «IS-A» не так проста. Когда дело доходит до «динамического полиморфизма», имеет место соотношение «IS-A», I.e. все, что вы можете сделать с Super, вы также можете делать с Derived экземпляром.

Однако в C ++ у нас также есть то, что часто называют статическим полиморфизмом (шаблоны, большую часть времени). Рассмотрим следующий пример:

class A {
public:
    virtual int m() {
        return 1;
    }
};

class B : public A {
private:
    virtual int m() {
        return 2;
    }
};

template<typename T>
int fun(T* obj) {
    return obj->m();
}

Теперь, когда вы пытаетесь использовать «динамический полиморфизм», все выглядит нормально:

A* a = new A();
B* b = new B();

// dynamic polymorphism
std::cout << a->m(); // ok
std::cout << dynamic_cast<A*>(b)->m(); // ok - B instance conforms A interface
// std::cout << b->m(); fails to compile due to overriden visibility - expected since technically does not violate IS-A relationship

... но когда вы используете " статический полиморфизм "вы можете сказать, что отношение« IS-A »больше не выполняется:

A* a = new A();
B* b = new B();

// static polymorphism
std::cout << fun(a); // ok
//std::cout << fun(b); // fails to compile - B instance does not conform A interface at compile time

Итак, в конечном итоге изменение видимости метода является« довольно законным », но это одна из уродливых вещей в C ++, что может привести к ловушке.

2
задан marc_s 24 February 2019 в 06:45
поделиться

0 ответов

Другие вопросы по тегам:

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