从基类调用重写的方法

Posted

技术标签:

【中文标题】从基类调用重写的方法【英文标题】: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 方法?这个编译器是特定的吗?

谢谢

【问题讨论】:

【参考方案1】:

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

【讨论】:

请注意,在基本构造函数和析构函数中,情况并非如此。在那里它将调用基本实现。讨论:cplusplus.com/forum/general/109477【参考方案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

【讨论】:

以上是关于从基类调用重写的方法的主要内容,如果未能解决你的问题,请参考以下文章

访问从基类构造函数调用的重写方法中的私有方法

强制方法从基类调用子类新方法

从基类向下转换时是不是可以调用派生对象的虚拟方法?

如何从基类调用派生类方法?

Razor Pages - 在所有 OnGet 处理程序之后从基类调用方法

从基类调用静态函数