【发布时间】:2013-07-20 07:13:43
【问题描述】:
我有一个名为 base 的类。这个类是不可访问的(我的意思是源代码),因为它是一个第 3 方类。这个类有一个我想从(父)姐妹(比方说叔叔)类访问的方法。
class base {
public:
void do_something() {
std::cout << "base1::do_something" << std::endl;
}
};
我有另一个父类,它是通过使用crtp 来访问子类的成员:
template<typename crtpT>
class crtp {
public:
void foo() {
std::cout << "crtp::foo" << std::endl;
static_cast<crtpT*>(this)->bar();
//static_cast<crtpT::base_type*>(this)->do_something();
// how do i access base::bar
}
};
最后,继承自两者的子类:
template<typename baseT>
class child : public baseT, public crtp<child<baseT> > {
public:
typedef baseT base_type;
void bar() {
std::cout << "child::bar" << std::endl;
}
};
main.cpp:
int main(int argc, char* argv[]) {
child<base> ch;
ch.do_something();
ch.foo();
ch.bar();
return 0;
}
现在我的问题是,我需要从我的 crtp 类访问do_something。这甚至可能吗?
static_cast 不起作用。我认为在生成 crtp 类时,编译器对基类一无所知。 crtp class 必须是 class child 的父级,因为许多其他类都派生自它。否则我可以使用delegation to sister-class。
编辑:
我可以在我的孩子体内做第二个 bar 方法,但这不是很好,因为我必须为 base 类中的所有方法编写包装器。
template<typename baseT>
class child : public baseT, public crtp<child<baseT> > {
public:
typedef baseT base_type;
void bar() {
std::cout << "child::bar" << std::endl;
}
void bar2() {
base_type::do_something();
}
};
然后调用:
static_cast<crtpT*>(this)->bar2();
【问题讨论】:
-
你试过2
static_casts吗?从crtp到child到base?
标签: c++ inheritance crtp