使用指令和抽象方法

时间:2014-07-11 11:22:53

标签: c++

我有一个类(让我们称之为A)继承了一个接口,定义了几个抽象方法,另一个类在那里考虑了一些代码(我们称之为B)。

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

int A::method() override
{
  return B::method();
}

我尝试使用B ::方法在A中编写,但我仍然得到一个错误,即A没有从接口实现抽象方法。 在这种情况下是否有特殊技术可用或者我运气不好? (如果是的话,是否应该采用这种方式?)。

感谢。

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

class A: public Interface, public B {
  using B::method;
};

3 个答案:

答案 0 :(得分:1)

让我们说清楚。你基本上有以下问题,对吗?

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::methodB::method根本没有相互关联,它们的相同名称只不过是巧合,就像其他人称为" Julien&#34 ;并不是因为你拥有相同的名字而与你有任何关系。

您基本上可以选择以下选项:

1。)只需手动编写电话:

struct A : Interface, B
{
    virtual void method()
    {
        B::method();
    }
};

2。)尽量减少使用宏的写作工作,以便你可以写:

struct A : Interface, B
{
    OVERRIDE(method)
};

但我强烈建议不要使用此解决方案。减少你的写作工作=为其他人提供更多的阅读工作。

3。)更改类层次结构,以便B实现Interface

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

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

struct A : B
{
};

答案 1 :(得分:-1)

如果B::method是抽象的,则无法调用它,因为未实现...没有代码。

一个例子:

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
}

答案 2 :(得分:-1)

即使有办法按照你的代码的可读性的名义做你想做的事情,我也不建议这样做。

如果你没有把" B ::"之前"方法"打电话,当我读到它时,我会说这是一个递归电话。