设计问题迫使我将基类向下转换为派生类型

Design issue forcing me to down-cast base class to derived types

本文关键字:转换 类型 派生 基类 问题      更新时间:2023-10-16

我有一个接受基类的类,但它需要接受派生类才能执行派生类特定的操作。然而,我需要它是多态的:

class I{
    OL ol;
}
//----------------------------------------------------------------------------
class OD{
    int data_member1;
    int data_member2;
}
class FD : public OD {
    int data_member3;
}
class ND : public OD{
    int data_member4;
}
//-----------------------------------------------------------------------------------
class OL{
    virtual void u(OD od) = 0;
}
class NL : public OL{
    //Accepts OD-type for polymorphism, but only ever uses ND-type objects
    void u(OD nd){
        //Manipulate datamember1
        //Manipulate datamember2
        //Manipulate datamember3 (which FD doesn't have)
    }
}
class CL : public OL{
    //Accepts OD-type for polymorphism, but only ever uses FD-type objects
    void u(OD fd){
        //Manipulate datamember1
        //Manipulate datamember2
        //Manipulate datamember4 (which ND doesn't have)
    }
}

问题是,我必须将OL::u()的参数类型声明为OD(这样我就可以使用多态性),但在NL::u()CL::u()中,参数类型必须是派生的,这样我才能访问特定派生的数据成员(ND没有datamember4FD没有datamember3)。

我该怎么办?我能想到的唯一解决方案是将NL::u()CL::u()中的OL对象下转换为派生类型,但这感觉很"黑客"。

我的总体目标是能够做到:

I i1;
OD fd = new FD();
i1.ol.u(fd);
I i2;
OD nd = new ND();
i2.ol.u(nd);

您试图使用多态性和继承性,但只有数据成员

如果你的基类声明了所有的抽象方法,那么yuo就可以调用这些方法,而不用担心数据成员在哪里。

即基类可以包含calc(),每个派生类中的calc(