【问题标题】:How to properly delegate interface to sister class in C++?如何正确地将接口委托给 C++ 中的姊妹类?
【发布时间】:2018-03-12 18:49:51
【问题描述】:

假设我有课程ChildParent,其中Child 扩展了Parent

class Parent {
    void foo() {cout << "foo\n";}
    void bar() {cout << "bar\n";}
    void jar() {cout << "jar\n";}
};

class Child: public Parent {
    void child_method1();
    void child_method2();
};

现在我想使用以下接口导出一些Child 功能:

class Interface {
public:
    virtual ~Interface(){}

    virtual void foo() = 0;
    virtual void bar() = 0;

protected:
    Interface(){}
};

如您所见,接口方法都已在Parent 中实现。如何正确定义 Child 以便将 Interface 委托给 Parent

我正在尝试这样做:

class Child: public Parent, public Interface {
    void child_method1();
    void child_method2();
}

但是编译器抱怨foo()bar()的虚方法在Child中没有实现。

如果我这样写一个明确的委托:

class Child: public Parent, public Interface {
    void foo() {Parent::foo();}
    void bar() {Parent::bar();}

    void child_method1();
    void child_method2();
}

编译器不会抱怨。 是否有必要编写显式委托?将虚拟方法委托给姐妹类的正确方法是什么?

【问题讨论】:

  • 看起来你的继承树搞砸了。如果您不需要覆盖派生类中的方法,那么拥有虚函数就没有意义。这个Interface 存在没有意义,只需传递对Parent 的引用即可。
  • 是的,您需要明确说明。在您的示例中,这些类是不相关的。 Parent::foo 不会自动成为 Interface::foo 的实现。但我认为这是XY problem。退后一步。为什么你认为你需要这样做?

标签: c++ class oop inheritance virtual-functions


【解决方案1】:

有必要写显式委托吗?

可以,否则会收到编译错误。

正确的方法是什么?

停下来重新考虑您的设计。

既然不需要在派生类中重写这些函数,为什么还要将函数标记为virtual

您可以只传递对父类的引用,而不是使用接口,现在这似乎没用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-05
    • 2012-07-05
    • 2010-12-14
    • 2013-07-20
    • 2012-01-31
    • 1970-01-01
    • 2016-09-23
    • 2011-03-29
    相关资源
    最近更新 更多