【发布时间】:2018-03-12 18:49:51
【问题描述】:
假设我有课程Child 和Parent,其中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