Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用指示和抽象方法_C++ - Fatal编程技术网

C++ 使用指示和抽象方法

C++ 使用指示和抽象方法,c++,C++,我有一个类,我们称之为a,它继承了一个定义了几个抽象方法的接口,还有一个类,在其中包含一些代码,我们称之为B 问题是,我在接口中有一个抽象方法,A实现该方法只是为了调用B版本。有没有一种方法可以使用关键字using来避免编写一个枯燥的方法,如: int A::method() override { return B::method(); } 我尝试使用B::方法在A中编写,但仍然得到一个错误,即A没有从接口实现抽象方法。 在这种情况下,是有特殊的技巧可以使用,还是我只是运气不好?如果是这样

我有一个类,我们称之为a,它继承了一个定义了几个抽象方法的接口,还有一个类,在其中包含一些代码,我们称之为B

问题是,我在接口中有一个抽象方法,A实现该方法只是为了调用B版本。有没有一种方法可以使用关键字using来避免编写一个枯燥的方法,如:

int A::method() override
{
  return B::method();
}
我尝试使用B::方法在A中编写,但仍然得到一个错误,即A没有从接口实现抽象方法。 在这种情况下,是有特殊的技巧可以使用,还是我只是运气不好?如果是这样的话,有没有一个具体的原因来解释为什么会这样

谢谢

编辑: 澄清一下,问题是,为什么不可以这样做:

class A: public Interface, public B {
  using B::method;
};
如果B::方法是抽象的,则无法调用它,因为它未实现。。。没有代码

例如:

class A
{
  public:
    virtual void method1( ) = 0;
    virtual void method2( ){ }
};

class B : public A
{
  public:
    virtual void method1( ) override
    { return A::method1( ); } // Error. A::method1 is abstract

    virtual method2( ) override
    { return A::method2( ); } // OK. A::method2 is an implemented method
}

即使有一种方法可以做你想做的事情,以代码可读性的名义,我也不建议这样做


如果不将B::before方法调用放在前面,当我读到它时,我会说它是一个递归调用。

让我们把这一点弄清楚。你基本上有以下问题,对吗

struct Interface
{
    virtual void method() = 0;
};

struct B
{
    void method()
    {
        // implementation of Interface::method
    }
};

struct A : Interface, B
{
     // some magic here to automatically
     // override Interface::method and 
     // call B::method
};
这根本不可能,因为从技术角度看,方法具有相同名称的事实是不相关的。换句话说,Interface::method和B::method根本不相关,它们相同的名字也只是巧合,就像其他叫Julien的人仅仅因为你有相同的名字而与你无关一样

您基本上只剩下以下选项:

一,。只需手动编写呼叫:

struct A : Interface, B
{
    virtual void method()
    {
        B::method();
    }
};
二,。尽量减少使用宏的写入工作,以便可以写入:

struct A : Interface, B
{
    OVERRIDE(method)
};
但我强烈反对这种解决方案。减少你的写作工作量=增加其他人的阅读工作量

三,。更改类层次结构,以便B实现接口:


我假设method和methode中有一个是打字错误,对吗?哦,是的,很抱歉,修正了。有真正的代码来显示问题会有所帮助,但简短的是,我不认为使用任何东西都能解决您似乎想要的问题。
struct Interface
{
    virtual void method() = 0;
};

struct B : Interface
{
    virtual void method()
    {
        // implementation of Interface::method
    }
};

struct A : B
{
};