【问题标题】:overloading functions with base class smart pointers使用基类智能指针重载函数
【发布时间】:2023-03-17 14:34:01
【问题描述】:

我有 3 个类:第一个是纯虚拟基类 base 和派生类 derived1、derived2...

第二个foo 持有一个指向基类的智能指针

第三个拥有一个指向foo 的智能指针,并且有一个重载的成员函数,我想依赖于 foo 中的指针指向的派生类。

这是工作代码

#include<iostream>
#include<boost/shared_ptr.hpp>

using namespace std;

class base{
public:
    base(){}
    ~base(){}
    virtual void FuncDer()=0;
};

class derived1 : public base{
    derived1(){}
    virtual void FuncDer(){
    cout<<"derived function1!"<<endl;
    }
};

class derived2 : public base{
    derived2(){}
    virtual void FuncDer(){
        cout<<"derived function2!"<<endl;
}
};

class foo {
public:
   foo();
    ~foo();
    boost::shared_ptr<base> get_base_ptr(){
        return base_obj;
    }
private:
    boost::shared_ptr<base> base_obj;
};

class bar {
public:
    bar();
    ~bar();
    void callfunc(){
    func(foo_ptr->get_base_ptr());
    }
private:
    boost::shared_ptr<foo> foo_ptr;
    void func(boost::shared_ptr<derived1>);
    void func(boost::shared_ptr<derived2>);
};


int main()
{
    cout<<"test"<<endl;

    return 0;
}

然而,这似乎失败了,错误是没有匹配的成员函数。所以我的问题首先是这种方法是否存在明显错误,其次是否有更有效/面向对象的设计方法可以更好地处理此类问题。

【问题讨论】:

  • 是否可以在派生类中增加以bar类的对象为参数的虚函数,并将bar::func函数改为public?
  • 抱歉耽搁了我直到现在才有机会看这个。我现在发布了重现我的错误的工作代码。

标签: c++ oop inheritance overloading


【解决方案1】:

原则上这是正确的做法:在基类上调用函数,多态会做正确的事。

但是,您的代码无法编译:bar 中的 func 定义无效(至少我不确定您的意图是什么 - 它们应该实现什么?)并且 func 调用callfunc 两次取消引用指针。

如果您需要具体的修复,请给出确切的错误。

【讨论】:

  • foo::get_base_ptr 返回shared_ptr&lt;base&gt; 和base 不能用作任何重载函数bar::func 的参数。代码目前不允许多态做正确的事情,必须重构。
  • 哦等等,我想我现在明白了目的:根据对象类调用不同的 func 重载?在那种情况下,是的,重构:理想情况下,应该在派生类中完成什么,只调用基础上的函数。将功能从 func(derived1) 移动到 derived1 中的 FuncDer()。 hacky 方法是检查 dynamic_casts 到所有派生类。
  • 在具有不同实现的两个派生对象中移动func()。然后,在callfunc 中调用foo_ptr-&gt;func()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多