继承基类的成员函数的虚拟说明符

时间:2015-09-11 12:29:30

标签: c++

以下代码基于 C ++模板:完整指南第298页上的示例。我删除了与我的问题无关的部分。

class Virtual {
  public:
    virtual void foo() {
    }
};

class Base : private Virtual {
  public:
    void foo() {
       std::cout << "Base::foo()" << '\n';
    }
};

class Derived : public Base {
  public:
    void foo() {
       std::cout << "Derived::foo()" << '\n';
    }
};

int main()
{
    Base *p = new Derived;
    p->foo();  // calls Derived::foo()
}

我不明白电话p->foo()最终会如何调用Derived::foo。更具体地说,p的静态类型是Base*Base::foo是非虚拟的。现在,Base私有地继承自“虚拟”,它有自己的foo,看起来好像Base::foovirtual以某种方式获得Virtual::foo说明符。这里到底发生了什么?

1 个答案:

答案 0 :(得分:5)

var eventName = listn; console.log("Listener invoked is: ", eventName); 的{​​{1}}内容继承自基类virtual

事实上,在foo中编写Virtual将是多余的,许多开发人员将省略它。一旦您在基类中将该函数标记为virtual,就无法撤消 Derived::foo

您可以通过撰写virtual强制拨打virtual,但这是一个丑陋的设计。