【问题标题】:Calling an overridden method from the base class从基类调用重写的方法
【发布时间】:2012-12-12 11:07:32
【问题描述】:

假设我有以下课程:

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

谢谢

【问题讨论】:

    标签: c++ methods overriding


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 2023-03-12
      • 2013-05-06
      • 2017-05-05
      相关资源
      最近更新 更多