协变返回类型和分派

3
我对这个简单程序感到困惑:
#include <iostream>

using namespace std;

struct Base {
  virtual ~Base() {}
  virtual Base* concrete() { cout << "concrete returning base - "; return this;}
  void stat() { cout << "I'm a BASE\n";}
};

struct Derived: Base {
  Derived* concrete() override { cout << "concrete returning derived - "; return this;}
  void stat() { cout << "I'm a DERIVED\n";}
};


int main() {
  Base * bd = new Derived;
  bd->stat();  // prints: "I'm a BASE"
  bd->concrete()->stat(); //prints: "concrete returning derived - I'm a BASE"

  delete bd;
  return 0;
}

为什么最后一行没有打印出 concrete returning derived - I'm a DERIVED?这里发生了什么?
1个回答

4
你可能误解了协变返回类型的用途...... 当调用上下文知道它正在处理一个Derived类型的对象时,它就会发挥作用:
Derived d;
d->concrete()->stat();

在您的情况下,concrete被调用在一个Base*上,虽然它是多态分派并返回一个Derived*,但该指针在调用上下文中被视为Base*,而且是Base*静态类型决定对stat()的静态调度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接