加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 具有相同名称的抽象和已定义继承函数的多重继承

发布时间:2020-12-16 07:29:00 所属栏目:百科 来源:网络整理
导读:首先,我道歉,如果有另一个帖子可以解答这个问题,我发现的所有类似帖子都涉及钻石继承方案或定义的函数,但事实并非如此. 简而言之,我想知道是否有可能让一个类继承自另外两个类,其中两个子类都具有相同名称和参数的函数,但它在一个子类中定义,而在另一个子类
首先,我道歉,如果有另一个帖子可以解答这个问题,我发现的所有类似帖子都涉及钻石继承方案或定义的函数,但事实并非如此.

简而言之,我想知道是否有可能让一个类继承自另外两个类,其中两个子类都具有相同名称和参数的函数,但它在一个子类中定义,而在另一个子类中定义为pure-virtual.此外,如果我可以这样做,调用pure-virtual / abstract类上的函数最终会调用另一个子类上的已定义函数,而对派生类的更改最小?

例:

class A
{
    public:
    virtual void Set(int X) = 0;
};

class B
{
    public:
    virtual void Set(int X);
};

class AB : public A,public B
{
    //other methods not relevant to example go here
};

int main(int argc,char **argv)
{
    int Y = 5;
    A* ObjectA = new AB();
    ObjectA->Set(Y);
    return 0;
}

到目前为止,我编译这个基本示例的尝试都遇到了错误:

‘AB’ : cannot instantiate abstract class
due to following members:
‘void A::Set(int)’ : is abstract

在进行自己的研究时,我找不到一个明确的答案,但基于处理相关主题的其他问题,我发现在AB类中使用“使用B :: Set”可能对此有所帮助.但是当我尝试将其添加到AB类定义时,错误仍然存??在.

有什么方法可以让我的工作吗?

解决方法

您是否尝试过实施该方法:

class AB : public A,public B
{
    void Set(int X) {}
};

它不起作用的原因是A :: Set()是纯虚拟的.即它没有实施.但你试着打电话给它.您必须在派生类中重写它,以便能够实例化派生类.

由于您有A *,因此在您的情况下使用不起作用,因此编译器没有歧义.

如果你有:

AB* ObjectA = new AB();
ObjectA->Set(Y);

你必须在AB的声明中使用才能解决歧义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读