代码之家  ›  专栏  ›  技术社区  ›  Carbon

为什么我必须显式地定义由固有类提供的方法?

  •  0
  • Carbon  · 技术社区  · 6 年前

    请考虑以下几点:

    #include <string>
    
    struct animal
    {
    public:
        virtual std::string speak() = 0;
    };
    
    struct bird : public animal
    {
    public:
        std::string speak()
        {
            return "SQUAK!";
        }
    };
    
    struct landAnimal : public animal
    {
        virtual int feet() = 0;
    };
    
    
    struct sparrow : public bird, public landAnimal
    {
        int feet() { return 2; }
        // This solves it, but why is it necessary, doesn't bird provide this?
        // std::string speak(){ return this->speak(); } 
    };
    
    int main()
    {
        sparrow tweety = sparrow();
    }
    

    编译它,您将得到:

    1>ex.cpp(35): error C2259: 'sparrow': cannot instantiate abstract class
    1>  ex.cpp(35): note: due to following members:
    1>  ex.cpp(35): note: 'std::string animal::speak(void)': is abstract
    1>  ex.cpp(10): note: see declaration of 'animal::speak'
    

    为什么需要注释方法来编译它?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Quentin    6 年前

    因为,不像你标记的,你 不要 拥有钻石遗产。你的 sparrow 是两个 animal 其中只有一个是由 bird . 另一个,通过 landAnimal ,不是。

    要获得一颗真正的钻石,你需要的是虚拟继承,但你会发现它附带了大量的注意事项。

    作为旁注 Martin Bonner 正确地指出:

    或许值得指出的是,“修复”根本不是修复。任何电话 sparrow::speak() 将导致无限递归。必须是 std::string speak() { return Bird::speak(); } .