假设我有两个班级:
class A
{
public:
A* Hello()
{
return this;
}
}
class B:public class A
{
public:
B* World()
{
return this;
}
}
让我说我有B
类的实例,如此:
B test;
如果我致电test.World()->Hello()
那就行了。
但由于test.Hello()->World()
返回Hello()
类型,A
无效。
如何让Hello()
返回B
的类型?我不想使用virtual
函数,因为我们有超过20个不同的类继承A
。
答案 0 :(得分:18)
您可以使用CRTP,这是一种奇怪的重复出现的模板模式:
template<class Derived>
class A
{
public:
Derived* Hello()
{
return static_cast<Derived*>(this);
}
};
class B : public A<B>
{
public:
B* World()
{
return this;
}
};
int main() {
B test;
test.World()->Hello();
test.Hello()->World();
}
答案 1 :(得分:0)
你可以在B中使用另一个Hello方法,即使它不是虚拟的:
class A
{
public:
A* Hello() { return this; }
}
class B:public class A
{
public:
B* Hello() { return this; }
B* World() { return this; }
}
答案 2 :(得分:0)
没有必要让Hello()
返回B*
。 Hello()
正在返回A*
,您需要做的就是将A*
投放到B*
,以便能够致电test.Hello()->World()
。例如:
B* b = dynamic_cast<B*>(test.Hello());
if(b != 0) b->World();