首页 > 解决方案 > C++ 类型推断

问题描述

class Animal               { public: virtual void say() const { std::cout << "mew ?\n"; } };
class Lion : public Animal { public: virtual void say() const { std::cout << "roar !\n"; } };
class Autobus              { public: virtual void say() const { std::cout << "vroum !\n"; } };
// 1 client acting on these classes
struct PetSomething {
    void operator()(const Animal& a)  { cout << "It says ";  a.say(); }
    void operator()(const Autobus& a) { cout << "It makes "; a.say(); }
};

int main(void) {
  std::variant<Animal, Autobus> thing; // Declaration of $\textrm{\szif thing}$
  thing = Animal();
  std::visit(PetSomething{}, thing);   // Displays "It says mew ?"
  thing = Autobus();
  std::visit(PetSomething{}, thing);   // Displays "It makes vroum !"
  thing = Lion();
  std::visit(PetSomething{}, thing);   // Displays "It says mew ?"
  thing = 666;                         // Type error          
} 

我想知道我们在这里使用的是什么类型的多态性,以及为什么我们在这里特别有这种行为:

thing = Lion();
  std::visit(PetSomething{}, thing);   // Displays "It says mew ?"

标签: c++typespolymorphismtype-inferencevariant

解决方案


推荐阅读