虚函数的返回类型应该与基类或协变类型相同。但为什么我们有这个限制?虚函数的返回类型不同
回答
因为使用返回值的代码如何处理各种无关的类型回来?例如: -
class A
{
public:
virtual float func();
};
class B: public A
{
public:
virtual char *func();
};
A *p = (some_condition) ? new A() : new B();
p->func(); // Oh no! What is the type?
是的,不相关的类型=错误。其他相关类型呢? – curiousguy 2012-08-09 00:15:25
,因为这会引发很多的废话:
struct foo
{
virtual int get() const { return 0; }
};
struct bar : foo
{
std::string get() const { return "this certainly isn't an int"; }
};
int main()
{
bar b;
foo* f = &b;
int result = f->get(); // int, right? ...right?
}
这是不明智的有一个派生类的东西回报完全无关。
讨论[转移到聊天。](http://chat.stackoverflow.com/rooms/15288/discussion-between-gmannickg-and-curiousguy) – GManNickG 2012-08-13 19:08:53
结束聊天:** GManNickG承认,目前的C++规则只有允许指针(或引用)可以放松。** – curiousguy 2012-08-13 19:42:54
不是“承认”,我从来没有否认它首先... – GManNickG 2012-08-14 02:02:08
根据C++标准:
压倒一切的函数的返回类型应是等同于重写FUNC- 和灰或协变与函数的类的返回类型。如果函数d :: F覆盖的函数B :: f,其 返回类型的功能是协变如果满足以下条件:
1)两者都是类型指针或引用类
2)B :: f的返回类型中的类与D :: f的返回类型中的类相同,或者是类的明确且可访问的直接或间接基类返回类型D :: f
3)指针或引用es具有相同的cv资格,并且返回类型D :: f 中的类类型具有与返回类型B :: f中的类类型相同的cv资格或更少的cv资格。
答案与Bjarne Stroustrup常见问题的"Why can't I assign a vector<Apple*> to a vector<Fruit*>?"的答案非常相似。
在处理多态类型时,修改返回类型的能力会导致语言类型安全性的一个漏洞(请参阅@GManNickG的答案,了解具体示例)。
当影响返回类型是理想的时候,有一种相当常见的情况:当从基类型的虚拟方法返回多态指针时。例如,
class Base {
public:
virtual Base* parent() = 0;
};
class Child : public Base {
public:
Base* parent() override
{
return parent_;
}
private:
Parent* parent_; // Assume `Parent` type exists.
};
在这里,我们失去了类型信息Child
知道它是parent_
成员。这导致大量的铸造,即使这种类型是在一个明确定义的点。我们可以解决这个使用Curiously Recurring Template Parameter(CRTP)成语,
template<class ParentType>
class Base {
public:
virtual ParentType* parent()
{
return parent_;
}
private:
ParentType* parent_;
};
class Child : public Base<Parent> {
};
- 1. 函数Java的不同返回类型
- 2. 不同的Java函数返回类型
- 3. 虚拟函数返回类型
- 4. 尽管返回类型定义不同,函数返回Int
- 5. 返回相同函数类型的泛型memoize函数
- 6. 基于enum输入返回不同类型的泛型函数
- 7. 函数返回不同类型的值是不好的
- 8. 推导其参数的返回类型函数返回类型
- 9. 从函数返回不同的子类?
- 10. 重构一个返回不同数据类型的函数
- 11. 函数返回一个不同的数据类型
- 12. 使用模板从函数返回不同的数据类型
- 13. 函数中返回值的数据类型不同?
- 14. WCF返回不同类型的数据
- 15. 返回与参数不同的类型
- 16. information_schema.columns返回不同的数据类型。
- 17. 函数返回类型decission
- 18. Infere函数返回类型
- 19. typedefing函数返回类型
- 20. 让函数返回类型
- 21. 返回不同类型
- 22. 具有非无效返回类型的虚函数
- 23. C++虚拟方法返回不同的派生类型
- 24. 返回函数的函数的返回类型
- 25. lambda函数返回类型不工作
- 26. 函数不指示返回类型 - Scala
- 27. 函数覆盖不同的返回类型
- 28. 两种不同的返回类型在PHP函数
- 29. 返回不同类型的模板函数
- 30. 返回类型的回调函数
您预计覆盖函数的返回类型被允许是...? – curiousguy 2012-08-07 18:20:45