参数中的C++协方差

use*_*026 17 c++ virtual covariance

我想知道为什么C++不支持参数的协方差,如下例所示,或者是否有办法实现它?

class base {
public:
virtual base* func(base * ptr) { return new base(); }
};

class derived : public base {
 public:
 virtual derived* func(derived * ptr) override { return new derived(); } //not allowed
};
Run Code Online (Sandbox Code Playgroud)

Fle*_*exo 16

返回类型是允许的,因为derived继承自base,但是函数参数不能工作 - 并非所有base实例也都是derived.在func调用base带有不是参数的参数的指针的情况下应该发生什么derived?派生最多的实现不可调用.

  • 这违反了liskov替代原则. (8认同)
  • @Winter 除非您按值传递,否则没有切片(并且按值传递对于多态函数会很奇怪,这是这里的问题)。传递指针(如问题中所示)或引用/shared_ptr/unique_ptr 都可以工作,并且无需任何其他面向对象语言的切片即可进行转换。唯一的问题是使用哪种强制转换来保证安全并适合您的类型层次结构,这归结为在 dynamic_cast 或 static_cast 之间进行选择,并严厉警告用户不要违反您强加的不成文合同。可能你想重新审视你的设计决策。 (2认同)