【发布时间】:2014-11-16 04:39:45
【问题描述】:
我有两个抽象类,fooBase 和 barBase。它们都有两个(或更多)具体的子类(foo1、foo2 和 bar1、bar2)。我想要barBase 的每个子类的一个方法来调用与fooBase 中的一个具体类对应的方法。例如,
class fooBase{
virtual int method()=0;
};
class foo1 : public fooBase {
public :
foo1(){}
int method(){return 1;}
};
class foo2 : public fooBase {
public :
foo2(){}
int method(){return 2;}
};
class barBase {
virtual int drilldown(fooBase &)=0;
};
class bar1 : public barBase {
public :
bar1(){}
int drilldown(foo1 & f){return f.method();}
};
class bar2 : public barBase {
public :
bar2(){}
int drilldown(foo2 & f){return f.method();}
};
然后在 main() 中执行:
foo1 f1;
foo2 f2;
bar1 b1;
bar2 b2;
但我得到了错误:Variable type 'b1' is an abstract class(同样适用于 b2)。我知道发生这种情况是因为barBase 中的方法drilldown 是使用引用fooBase 抽象类的参数定义的,但bar1 和bar2 正试图深入到具体的子类中,因此编译器不会t 认识到drilldown(fooBase &) 的方法是在子类中定义的。我该如何解决这个问题,以便获得我想要的行为?这种情况下正确的设计模式是什么?
我最终使用了 Joachim Pileborg 的解决方案(见下文)。我还必须将带有参数 barBase & 的任何函数更改为模板函数,即
template<class T>
int fn(barBase<T> & b, T & f){
return b.drilldown(f);
}
int main(int argc, const char * argv[])
{
foo1 f1;
foo2 f2;
bar1 b1;
bar2 b2;
std::cout<<b1.drilldown(f1);
fn(b1,f1);
return 0;
}
【问题讨论】:
-
将
bars 定义为类模板和实例化,而不是多态层次结构? -
@Sambuca,是的,我意识到这一点。
-
@OliverCharlesworth,你能给我更多的信息吗?
标签: c++ inheritance polymorphism abstract-class virtual-functions