class A {};
class B : A {};
class C {
virtual B *f() { returnNULL; }
};
class D : C {
virtual A *f() { returnNULL; } //Error: overriding virtual function with different return type
};
class C;
class A {
virtual A *f() { returnNULL; }
};
class B : A {
virtual C *f() { returnNULL; } //Error: overriding virtual function with different return type
};
class C : B {
virtual C *f() { returnNULL; } //нормально
};
class C;
class A {
virtual A *f() { returnNULL; }
};
class B : A {
virtual C *f() { returnNULL; } //Error: overriding virtual function with different return type
};
class C : A {};
class C;
class A {
virtual A *f() { returnNULL; }
};
class C : A {};
class B : A {
virtual C *f() { returnNULL; } //нормально
};
现在谁来解决这个问题,当一个模板类中的模板方法由于某种原因没有被编译器找到而发生错误时?
no one of overloads can be applied to the function call
?
在这种情况下,C语言编译器会具体写出被替换的类型,以及找不到什么原型的函数,所以或多或少能看出问题所在,但这里--没有具体说明。
我们是故意这样做的,因为直接继承没有问题。
我想看看确切的规则:什么时候我有权用不同类型的返回值来覆盖一个虚拟函数?
还是超载?
我想看看确切的规则:什么时候我有权用不同类型的返回值来覆盖一个虚拟函数?
谢谢你。这一切都很有意义。
...当一个被覆盖的函数的返回类型被继承时...从被覆盖的类型返回的类型。
如果是相反的情况呢?
如果是相反的情况呢?
你的例子中有一个错误--没有从C继承D的内容
是的,我的错误,对不起。
另一个有争议的例子。
另一个有争议的例子。
尽管有错误(因为不会有可执行的生成),函数B::f覆盖了A::f,所以C::f没有覆盖的错误。
我不太明白这个意思,但几乎是一样的
一种情况下有错误,另一种情况下没有错误。而我只是换了一下线