我试图了解继承和多态性。当我运行这个:
#include<iostream>
using namespace std;
class Base
{
int x;
public:
virtual Base* fun() = 0;
int getX() { return x; }
};
// This class inherits from Base and implements fun()
class Derived: public Base
{
public:
int y;
Derived* fun() {
Derived *d = new Derived;
d->y = 2;
return d;
}
};
int main(void)
{
Derived d;
Derived *p = d.fun();
cout<< p->y;
}
这很好用,因为只要返回类型与原始返回类型协变,派生类使用其他返回类型覆盖虚拟函数是合法的
但是如果虚拟函数包含type的输入参数,该怎么办Base*
?喜欢 :
#include<iostream>
using namespace std;
class Base
{
int x;
public:
virtual Base* fun(Base * t) = 0;
int getX() { return x; }
};
// This class inherits from Base and implements fun()
class Derived: public Base
{
public:
int y;
Derived* fun(Derived *t) {
Derived *d = new Derived;
d->y = t->y;
return d;
}
};
int main(void)
{
Derived d;
Derived *p = d.fun();
cout<< p->y;
}
这引发了错误error: invalid new-expression of abstract class type ‘Derived’ Derived *d = new Derived;
,据我所知,这意味着编译器无法识别虚拟函数的实现,并没有将类``Derived''视为抽象。
那么我们如何覆盖这种类型的虚函数呢?我试图搜索它,但是没有找到任何参考。如果存在类似的问题,请告诉我。谢谢
如果我需要在自己的代码中这样做。我将这样编写新的派生类:
// This class inherits from Base and implements fun()
class Derived: public Base
{
public:
int y;
Derived* fun(Base *t) {
Derived *d = new Derived;
Derived* input = dynamic_cast<Derived *>(t);
ASSERT(input); // Cause the debug version to throw an exception so the error can be debugged
if(input)
d->y = t->y;
else
d->y = 0; // Or the default of your choice.
return d;
}
};
如果传入的基本类型不是正确的派生类型,则会引入潜在的运行时错误。但是我没有办法避免这种情况。
我看到的其他选项是使用模板。在派生类型要求传入派生类型的地方。或者简单地创建一个新函数,该函数将派生类型作为输入并覆盖fun(Base *t)
;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句