首先,我知道C++ 标准(ISO/IEC 14882:2003):第 11.5 节,第 1 段,但事实并非如此(但编译器显然不这么认为)。
我尝试通过此指针在派生类方法中调用受保护的基类方法,静态转换为基类指针,并在 MSVC2008 中出现错误 C2248: 'A::f' : cannot access protected member declaration in class 'A'。
我必须在“奇怪地重复出现模板模式”的上下文中执行此操作,但我可以用更简单的代码重现此错误,如下所示:
class B
{
protected:
void f(){}
};
class D : public B
{
public:
void g()
{
f(); // ok
this->f(); // ok
static_cast<B*>(this)->f(); // C2248 in MSVC2008
dynamic_cast<B*>(this)->f(); // C2248
((B*)this)->f(); // C2248
}
};
D d; d.g();
似乎编译器认为将此指针转换为指向其他实例的指针,是吗?
在这种情况下编译器是错误的,你怎么看?
好的,我的真实代码更像这样:
template<class T>
class B
{
public:
void g()
{
f(); // error C3861: 'f': identifier not found
this->f(); // error C3861: 'f': identifier not found
// static_cast to derived class
static_cast<T*>(this)->f(); // C2248 in MSVC2008
}
};
class D : public B<D>
{
protected:
void f(){}
};
我将它转换为派生类,我不能使用this->f();
顺便说一句,我看到这段代码不安全,例如class E : public B<D> {...};
:可编译,但 static_cast 会产生错误的强制转换。