اصلاح متد override در وراثت - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

اصلاح متد override در وراثت

+1 امتیاز

سلام خدمت دوستان عزیز

کدی که در زیر مشاهده می کنید در پایین ترین سطوح قصد دارم که متد process را override کنم به این شرط که بتونم در متد override شده نوع داده ای جدید را استفاده کنم آیا برای چنین کار راهی وجود داره یا اصولا همچین پیاده سازی غلطه؟

#include <iostream>
#include <mutex>
#include <memory>
#include <vector>

using namespace std;

struct RecoItem{
    virtual ~RecoItem(){}
};

struct IRecoItems{
    virtual ~IRecoItems(){}
    std::vector<RecoItem> items_;
};

template<typename T>
struct RecoItems : IRecoItems{
    
};

struct IReco{
    virtual ~IReco(){}
    virtual IRecoItems process()=0;
    IRecoItems items_;
};

template<typename Item_>
struct RecoChild : IReco{
    using RecoItemsA = RecoItems<Item_>;
 
 
};

 struct MyData : RecoItem{
   string str_;  
 };

 struct MyRecoChild : RecoChild<MyData>{
     using MyDatas = RecoItems<MyData>;
    virtual  MyDatas process() override{
        MyDatas result;
        return result;
    };

};

 

سوال شده خرداد 13, 1399  بوسیله ی ابید (امتیاز 781)   19 89 106

2 پاسخ

+2 امتیاز
 
بهترین پاسخ
با اجازه دوستان.

c++ به شما اجازه نمیده smart_pointer ها را در متدهای virtual استفاده کنید بجای آن هم می تونید از Pointer استفاده کنید .شما متغیرهای عضو کلاستون می تونه از نوع smart_pointer باشه ولی برای استفاده در virtual متدها می تونید با متد get اشاره گر مربوطه را دریافت و استفاده کنید.
پاسخ داده شده خرداد 13, 1399 بوسیله ی toopak (امتیاز 2,458)   16 48 66
انتخاب شد آذر 14, 1399 بوسیله ی farnoosh
+1 امتیاز

به صورت مستقیم نمی  تونید از اشاره گر های هوشمند در  covariance استفاده کنید ولی از دو روش زیر می تونید به صورت غیر مستفیم استفاده اش کنید:

روش اول استفاده از اشاره گر معمولی :

struct Base
{
private:
   virtual Base* doClone() const { ... }

public:
   shared_ptr<Base> Clone() const { return shared_ptr<Base>(doClone()); }

   virtual ~Base(){}
};

struct Derived : Base
{
private:
   virtual Derived* doClone() const { ... }

public:
   shared_ptr<Derived> Clone() const { return shared_ptr<Derived>(doClone()); }
};

 

روش دوم استفاده از اشاره گر هوشمند :

struct Base
{
private:
   virtual shared_ptr<Base> doClone() const { ... }

public:
   shared_ptr<Base> Clone() const { return doClone(); }

   virtual ~Base(){}
};

struct Derived : Base
{
private:
   virtual shared_ptr<Base> doClone() const { ... }

public:
   shared_ptr<Derived> Clone() const
      { return static_pointer_cast<Derived>(doClone()); }
};

 

پاسخ داده شده مرداد 18, 1399 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
...