C++ 在接口外部使用公共虚拟派生类

C++ 在接口外部使用公共虚拟派生类,c++,c++14,C++,C++14,在这种情况下,我有两个类,一个接口和一个使用这两个类的实现 A类:公共虚拟接口 B类:公共虚拟接口 class B在内部使用class A,这是不允许的,因为class A是公共虚拟接口的派生类。我得到以下错误:错误:无法将变量“a”声明为抽象类型“a”有没有一种方法可以在不为a创建新类的情况下执行以下操作 class Interface { virtual void foo() = 0; virtual void bar() = 0; }; class A : public

在这种情况下,我有两个类,一个接口和一个使用这两个类的实现

A类:公共虚拟接口

B类:公共虚拟接口

class B
在内部使用
class A
,这是不允许的,因为
class A
是公共虚拟接口的派生类。我得到以下错误:
错误:无法将变量“a”声明为抽象类型“a”
有没有一种方法可以在不为
a
创建新类的情况下执行以下操作

class Interface 
{
    virtual void foo() = 0;
    virtual void bar() = 0;
};

class A : public virtual Interface
{
public:
    void foo(){ }
};

class B : public virtual Interface
{
public:
    void bar()
    {
        A a;
    }
};

class Implementation: public A, public B
{
public:
    Implementation()
    {
    }
};

int main(){
    Implementation impl;

    return 0;
}

不,不能实例化A,因为它没有实现接口中的所有纯虚拟函数


以下内容适合我

class Interface
{
  virtual void foo() = 0;
  virtual void bar() = 0;

public:
  virtual ~Interface() {}
};

class A : public virtual Interface
{
public:
  void foo() override {}
  void bar() override {}
};

class B : public virtual Interface
{
public:
  void foo() override {}

  void bar() override
  {
    A a;
  }
};

class Implementation : public A, public B
{
public:
  void foo() override { A::foo(); }
  void bar() override { B::bar(); }
};

int main()
{
  Implementation impl;

  return 0;
}

不,不能实例化A,因为它没有实现接口中的所有纯虚拟函数


以下内容适合我

class Interface
{
  virtual void foo() = 0;
  virtual void bar() = 0;

public:
  virtual ~Interface() {}
};

class A : public virtual Interface
{
public:
  void foo() override {}
  void bar() override {}
};

class B : public virtual Interface
{
public:
  void foo() override {}

  void bar() override
  {
    A a;
  }
};

class Implementation : public A, public B
{
public:
  void foo() override { A::foo(); }
  void bar() override { B::bar(); }
};

int main()
{
  Implementation impl;

  return 0;
}

这是不允许的,因为
A
仍然具有纯虚拟函数(
bar
)。。。这与它被“宣布为公共虚拟”无关。对于要实例化的
A
。。。无论如何,它需要实现
bar
类不是“声明的公共虚拟”,不存在这样的事情。这是不允许的,因为
A
仍然具有纯虚拟功能(
bar
)。。。这与它被“宣布为公共虚拟”无关。对于要实例化的
A
。。。无论如何,它需要实现
bar
类A不是“声明的公共虚拟的”,没有这样的事情。即使您将所有纯虚拟函数添加到
类A
,您也会得到一个错误:
没有唯一的最终重写器用于“implementation”中的“virtual void Interface::bar()”
我添加了一些适合我的代码。
A
B
都需要定义
foo
bar
。由于
A
B
都定义了
foo
bar
实现也需要定义它们,否则它们将是不明确的。我只是随意选择了要使用的实现。即使您将所有纯虚拟函数添加到
类A
,也会得到一个错误:
在“implementation”中没有唯一的“virtual void Interface::bar()最终重写器
我添加了一些适合我的代码。
A
B
都需要定义
foo
bar
。由于
A
B
都定义了
foo
bar
实现也需要定义它们,否则它们将是不明确的。我只是随意选择使用哪个实现。