21

假设我有以下课程:

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 方法?这个编译器是特定的吗?

谢谢

4

2 回答 2

27

如果A::fooB::barB. 实例是通过指针引用还是基类引用无关紧要:不管这个,B调用 's 版本;这就是使多态调用成为可能的原因。该行为不是特定于编译器的:虚函数根据标准以这种方式运行。

于 2012-12-27T01:17:16.113 回答
0

你不能,但你可以绕过它。在这种情况下,您可以将true默认 bool 参数添加到 A 构造函数,并false在 B 中将 a 传递给它:

class A 
{
public:
    A(bool construct = true) { 
        if (!construct) return;
        bar(); 
    }
    virtual void bar() { cout << "A::bar" << endl; }
};

class B : public A 
{
public:
    B() : A(false) { bar(); }
    void bar() override { cout << "B::bar" << endl; }
};

int main()
{
    A a;
    B b;
}

输出:

A::bar
B::bar
于 2021-10-17T23:35:09.370 回答