假设我有以下课程:
class A {
public:
virtual void foo() {
bar();
}
protected:
virtual void bar() {
// Do stuff
}
}
class B : public A {
protected:
virtual void bar() {
// Do other stuff
}
}
如果我有一个B实例并调用foo方法,那么会调用哪个bar方法?这个编译器是否具体?
由于
答案 0 :(得分:19)
如果您有A::foo
的实例,则B::bar
会调用B
。如果通过指针或对基类的引用引用实例并不重要:无论如何,都会调用B
的版本;这是使多态调用成为可能的原因。该行为不是特定于编译器的:虚函数根据标准以这种方式运行。