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

时间:2019-05-02 22:58:56

标签: c++ multiple-inheritance virtual-functions

我有3个班级: A B C B 继承自 A ,而 C 继承自 B (所以 C 是孙子( A )。
每个对象都有功能 talk()来显示文本,在 A B 中是虚拟的。
让我们使用外部函数 call( A &a),该外部函数通过引用获取对象 A ,并调用函数 talk()
将对象 C 发送到该函数,它使用来自 B talk()而不是 C ,甚至是< strong> 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;
    }

如果每个类之间都有 virtual talk()

,我希望 call(A&a)继承最远的继承版本

1 个答案:

答案 0 :(得分:1)

在您的示例中,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"; }
};