![]() |
1
2
只有当类型完全匹配时,原始函数指针才与赋值兼容。
但是,您可以使用
重写虚函数的规则不太允许:支持原始指针和引用类型的协变结果,但仅此而已。无反向方差。
mingw g++7.3.0编译结果: > g++ -c 2.cpp 2.cpp:11:21: error: 'Base* F3::f(Base*)' marked 'override', but does not override struct F3: F { auto f( Base* ) -> Base* R }; // !contravariant ^ 2.cpp:12:21: error: 'Derived* F4::f(Base*)' marked 'override', but does not override struct F4: F { auto f( Base* ) -> Derived* R }; // !covariant & contravariant 对于协方差对原始指针和引用结果类型的限制在实践中不是问题。例如,一个明显具有智能指针结果的协变函数可以很容易地表示为一个非虚拟重载,调用具有原始指针结果的虚拟函数。缺乏对反向方差的支持在实践中同样不是一个问题,但原因很简单,一个人永远不需要它。 |
![]() |
2
0
C++是这样设计的,不接受不同的参数,即使它是派生类。 看看这条线 Cast function pointers that differs by argument type C语言有一个虚拟机,不允许多重继承,所以C语言在这种情况下有更多的控制,你不能比较C和C++。 如果您想使用Cast,可以这样做,但是您假设在派生类和基类方面有任何错误,如果您做了错误的事情,它将使您的程序崩溃。
|
![]() |
softshipper · 为什么函子实现是可能的? 7 年前 |
![]() |
azal · 条件分布的均值和协方差 7 年前 |
|
Ian · 如何找到R中每n行的协方差 7 年前 |
![]() |
Marcel · C#泛型推断与协方差-错误或限制 8 年前 |
![]() |
Zac · 协方差混乱。无法将已实现接口的元组分配给元组列表 8 年前 |