将派生类转换为基类

Posted

技术标签:

【中文标题】将派生类转换为基类【英文标题】:Cast derived class to base 【发布时间】:2015-12-14 14:02:46 【问题描述】:

在这里(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&lt;A*&gt;(this); 是更好的做法吗?

【问题讨论】:

根本没有强制转换,只有隐式转换。强制转换是一种显式转换。 【参考方案1】:

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

标准转换是具有内置含义的隐式转换,是与 static_cast 或 C 样式转换等不同的概念。

一般情况下,最好尽可能依赖隐式转换。显式转换会增加更多代码噪音,并可能隐藏一些维护错误。

【讨论】:

严格来说,“可以转换为具有相同或更多限定符的B的指针” 我建议专门回答他的问题:“不,使用static_cast 并不是更好的做法——事实上,这是更糟糕的做法。如果不需要,请始终避免使用强制转换。” @MartinBonner 不同意!隐式转换是各种古怪错误的来源。有时我希望 C++ 甚至根本没有它们...明确表示没有错。 @Barry 您指的是标准转换还是用户定义的转换运算符或两者兼而有之? @Barry 你能举一个由隐式转换引起的错误的例子吗?【参考方案2】:

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

【讨论】:

以上是关于将派生类转换为基类的主要内容,如果未能解决你的问题,请参考以下文章

将派生类转换为基类

将指针从派生类转换为基类的最佳方法

无法将参数 1 从派生指针转换为基类指针引用

Part7 继承与派生 7.3基类与派生类类型转换

如何将此“命令处理程序映射”从派生类重构为基类?

C ++:将void *转换为基类指针时访问冲突