将派生类强制转换为基

Cast derived class to base

本文关键字:转换 派生      更新时间:2023-10-16

此处(在B::get()中)发生什么类型的强制转换?

class A {
public:
    A() : a(0) {}
    int a;
};
class B : public A {
public:
    A* get() {
        return this; //is this C-style cast?
    }
};
int main()
{
    B b;
    cout << b.get()->a << "n";
    system("pause");
    return 0;
}

我在一个著名的API中看到过这种代码。做static_cast<A*>(this);是更好的练习吗?

这是一个标准的派生到基指针的转换。规则是,如果BD的基类,则具有某些const/volatile限定符的指向D的指针可以转换为具有相同限定符的B的指针。

标准转换是具有内置含义的隐式转换,是类似于static_cast或C样式转换的独立概念。

通常情况下,最好在可能的情况下依赖隐式转换。显式转换增加了更多的代码噪声,并可能隐藏一些维护错误。

它是到祖先的隐式转换。隐式转换通常是安全的,它们不能做static_cast不能做的事情。实际上,它们更受限制:你可以用static_cast进行未检查的下转换,但不能用隐式转换。