虚函数输入参数类型

迪帕克

我试图了解继承和多态性。当我运行这个:

    #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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章