C++ 对象类型之间的转换

C++ 对象类型之间的转换,c++,eclipse-cdt,C++,Eclipse Cdt,我想做的是: void startApp() { //create validator MedValidator* val = new MedValidator(); //create reporsitory MedicineRepository* repo= new MedRepo() ; //create controller Control wh(repo, val); ...}

我想做的是:

void startApp() {
            //create validator
        MedValidator* val = new MedValidator();
        //create reporsitory
        MedicineRepository* repo= new MedRepo() ;
        //create controller
        Control wh(repo, val);
    ...}
以下是所用类型的视图:

 class MedValidator
    {
    public:
        void validate(const Medicine& s) throw(MedException);
    };


class MedicineRepository
{
public: virtual void addMed(Medicine s) ;
};

class MedRepo : public MedicineRepository{
public:void addMed(Medicine s);
protected:
    Vector<Medicine*> MedList;
};

如何解决此问题?我希望代码量足够,如果需要更多,我将添加。

控件的构造函数采用
MedRepo*
参数:

Control(MedRepo* repo, MedValidator* validator);};
但是您正在传递一个
MedicineRepository*

 MedicineRepository* repo= new MedRepo() ;
 //create controller
 Control wh(repo, val);

另外,不要使用异常规范,它们是。

您的问题是MedRepo是一个MedicineRepository,但MedicineRepository不是一个MedRepo。在需要派生类对象的情况下,不能替换基类对象,只能替换相反的(无论如何,安全地)。您需要弄清楚是否需要指向该特定派生类的指针,或者是否可以使用指向任何派生类的指针。对于前者,保持代码的原样,并向其发送一个MedRepo对象。如果任何派生类都可以(即,您只访问基类中的方法),则更改控件以接受基类。

Ok,但如果我将它们切换到
MedRepo*repo=new MedicineRepository()我收到一个新错误
从“MedicineRepository*”到“MedRepo*”[-fppermissive]
的无效转换,同时
MedicineRepository*repo=new MedRepo()
很好,因为
MedicineRepository
MedRepo
的基类,
MedRepo*repo=new MedicineRepository()
并不是因为没有从
MedicineRepository
MedRepo
的隐式转换。所以我们要告诉我的是修改`控制(MedRepo*repo,MedValidator*validator);` 在
对照组(MedicineRepository*repo、MedValidator*validator),对吗?如果您的目标是
控制
使用
MedicineRepository
的界面,那么这样做是解决此问题的一个好方法。这样,您仍然可以传递从
MedicineRepository
派生的类型,例如
MedRepo
,这些类型以不同的方式实现成员函数。
 MedicineRepository* repo= new MedRepo() ;
 //create controller
 Control wh(repo, val);