gpt4 book ai didi

c++ - 具有同名抽象和定义继承函数的多重继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:12:33 24 4
gpt4 key购买 nike

首先,如果有另一篇文章回答了这个问题,我深表歉意,我发现所有类似的文章都涉及菱形继承方案或定义的函数,而这不是。

简而言之,我想知道是否有可能让一个类继承自另外两个类,其中两个子类都有一个具有相同名称和参数的函数,但它是在一个子类中定义的,并且是纯虚拟的其他。此外,如果我能做到这一点,调用纯虚拟/抽象类上的函数是否会最终调用另一个子类上定义的函数,而对派生类的更改最少?

例子:

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 类中使用“using B::Set”可能有助于解决这个问题。但是当我尝试将它添加到 AB 类定义时,错误仍然存​​在。

我有什么办法可以让它工作吗?

最佳答案

如果您在 AB 中有 2 个普通函数 Set,那么 使用 B::Set 将告诉编译器,如果你有类 AB 的对象并调用该对象的方法 SetB::Set 将被调用,如果 AB::Set 未明确定义。

你的情况不同。你有纯虚函数 A::Set 导致 A 成为抽象类。由于 AB 不会覆盖 A::Set,因此 AB 也变得抽象,这就是您无法实例化它的原因。

你可以在这里做什么

你可以实现AB::set来调用B::Set:

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

另外,我不建议基类使用相同的方法名,因为我不建议多重继承,请尝试使用聚合。

关于c++ - 具有同名抽象和定义继承函数的多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9251189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com