以下代码基于 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::foo
从virtual
以某种方式获得Virtual::foo
说明符。这里到底发生了什么?
答案 0 :(得分:5)
var eventName = listn;
console.log("Listener invoked is: ", eventName);
的{{1}}内容继承自基类virtual
。
事实上,在foo
中编写Virtual
将是多余的,许多开发人员将省略它。一旦您在基类中将该函数标记为virtual
,就无法撤消 Derived::foo
。
您可以通过撰写virtual
强制拨打virtual
,但这是一个丑陋的设计。