gpt4 book ai didi

c++ - 分层接口(interface)和实现

转载 作者:可可西里 更新时间:2023-11-01 18:38:22 25 4
gpt4 key购买 nike

以下代码仅在您取消注释该行时才有效

  virtual void FuncA() { ImplA::FuncA(); }

ImplB 类中,否则我会得到编译器错误:

cannot instantiate abstract class ... FuncA(void)' : is abstract

问题是为什么它没有从继承的ImplA中获取FuncA()的实现?

class InterfaceA  {
public:
virtual void FuncA()=0;
};

class InterfaceB : public InterfaceA {
public:
virtual void FuncB()=0;
};

class ImplA : public InterfaceA {
public:
virtual void FuncA() { printf("FuncA()\n"); }
};

class ImplB : public ImplA, public InterfaceB {
public:
// virtual void FuncA() { ImplA::FuncA(); }
virtual void FuncB() { printf("FuncB()\n"); }
};

{
ImplB *b = new ImplB();
InterfaceA *A= b;
A->FuncA();
InterfaceB *B= b;
B->FuncB();
B->FuncA();
}

最佳答案

您遇到了多重继承中“钻石”问题的一个实例。您将需要使用“虚拟”继承(相当于在继承时添加关键字virtual)

问题是 ImplB 有两条通往基类 InterfaceA 的路径。但是,您的意图是接口(interface)不提供任何实现。因此,您需要将此指示给编译器,以便它可以统一纯虚函数。

为了更好的解释: http://www.cprogramming.com/tutorial/virtual_inheritance.html

我已经修改了您的代码以在您从接口(interface)继承时添加虚拟。现在它编译了,即使有注释行。另请注意,我认为您缺少虚拟析构函数,因此您还会遇到其他一些问题。此代码编译,无需取消注释 FuncA。

#include <cstdio>

class InterfaceA {
public:
virtual void FuncA()=0;
};

class InterfaceB : public virtual InterfaceA {
public:
virtual void FuncB()=0;
};

class ImplA : public virtual InterfaceA {
public:
virtual void FuncA() { printf("FuncA()\n"); }
};

class ImplB : public ImplA, public virtual InterfaceB {
public:
// virtual void FuncA() { ImplA::FuncA(); }
virtual void FuncB() { printf("FuncB()\n"); }
};

int main()
{
ImplB *b = new ImplB();
InterfaceA *A= b;
A->FuncA();
InterfaceB *B= b;
B->FuncB();
B->FuncA();
}

关于c++ - 分层接口(interface)和实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37233091/

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