作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
以下代码不起作用,因为您不能从私有(private)基类static_cast
。
用 C 风格的转换来替换转换是可行的(尽管我最初认为这会调用未定义的行为,但显然它不会,请参阅 this answer ),但是相当丑陋,因为它还允许您绕过常量检查等. 另一种方法是使 CRTPBase 成为友元,但这会暴露所有 Derived 的私有(private)成员。
是否有另一种不使用 C 风格转换也不使 CRTPBase 成为友元的编写方式?
template<typename T>
struct CRTPBase {
void callBase() {
T * derived = static_cast<T*>(this);
derived->publicMethod();
}
};
struct Derived : private CRTPBase<Derived> {
void callParent() { this->callBase(); }
void publicMethod() {}
};
int main() {
Derived d;
d.callParent();
return 0;
}
最佳答案
我认为最好的解决方案是避免私有(private)继承,而是选择数据隐藏。将成员函数标记为 protected 将防止从派生类以外的任何地方进行访问。取而代之的是进一步的奖金公共(public)继承。
template<typename T>
class CRTPBase {
protected:
void callBase() {
T * derived = static_cast<T*>(this);
derived->publicMethod();
}
};
struct Derived : public CRTPBase<Derived> {
void callParent() { this->callBase(); }
void publicMethod() {}
};
int main() {
Derived d;
d.callParent();
d.callBase() // <- illegal
return 0;
}
关于c++ - 来自私有(private) CRTP 基地的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23201429/
目前我有几个配置了以下目录的catalina bases, conf logs server webapps work bin、lib 和common 目录都还在$CATALINA_HOME 中。 我
我是一名优秀的程序员,十分优秀!