虚函数不会覆盖到最新的继承对象

Virtual function does not overrides to latest inheriting object

我有 3 个 classes: A, B, C . B 继承自 AC 继承自 B (所以 CA 的孙子)。
每个对象都有显示文本的函数 talk(),在 AB 中它是虚拟的。
让外部函数 call(A &a),通过引用获取对象 A,并调用函数谈话().
将对象 C 发送到函数,它使用 B 中的 talk() 而不是 C,甚至 B talk() 也是虚拟的。
为什么会这样?如何让它从 C?

调用版本
    #include <iostream>
    using namespace std;

    class A {
    public:
        virtual void talk() = 0;
        virtual void say() = 0;
    };

    class B : public A  {
    public:
        virtual void talk() // Why C does not overrides this?
        {   cout << "hello\n";  }   
    };

    class C : public B  {
    public:
        void talk (int a)   // It should override B.talk();
        { cout << "bye\n";}
        virtual void say()  { cout << "my name\n"; }
    };

    void call(A &a) {
        a.talk();   // Why does it call virtual talk() from B rather than from C?
        a.say();    // This was found so it knows about object C
    }

    int main()  {
        C c;
        call(c);
        system("PAUSE");
        return 0;
    }

我预计 call(A &a) 如果每个 class 之间都有 virtual talk()

在您的示例中,C.talk(int) 不会覆盖 B.talk(),因为 C.talk 将 int 作为参数,因此它是一个完全不同的函数。

您可以在函数声明后添加 override 让编译器检查它是否真的覆盖了任何东西:

class C : public B  {
   public:
    // Here, the compiler complains because there's no talk(int) method
    // That it can override
    void talk (int a) override;
    { cout << "bye\n";}
    virtual void say()  { cout << "my name\n"; }
};