将派生类转换为基类
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<A*>(this);
是更好的做法吗?
【问题讨论】:
根本没有强制转换,只有隐式转换。强制转换是一种显式转换。 【参考方案1】:这是一个标准的派生到基指针转换。规则是,如果B
是D
的基类,则可以将带有一些const
/volatile
限定符的D
指针转换为带有相同限定符的B
指针。
标准转换是具有内置含义的隐式转换,是与 static_cast
或 C 样式转换等不同的概念。
一般情况下,最好尽可能依赖隐式转换。显式转换会增加更多代码噪音,并可能隐藏一些维护错误。
【讨论】:
严格来说,“可以转换为具有相同或更多限定符的B
的指针”
我建议专门回答他的问题:“不,使用static_cast
并不是更好的做法——事实上,这是更糟糕的做法。如果不需要,请始终避免使用强制转换。”
@MartinBonner 不同意!隐式转换是各种古怪错误的来源。有时我希望 C++ 甚至根本没有它们...明确表示没有错。
@Barry 您指的是标准转换还是用户定义的转换运算符或两者兼而有之?
@Barry 你能举一个由隐式转换引起的错误的例子吗?【参考方案2】:
隐式转换为祖先。隐式转换通常是安全的,它们不能做static_cast
不能做的事情。它们实际上更受限制:您可以使用static_cast
进行未经检查的向下转换,但不能使用隐式转换。
【讨论】:
以上是关于将派生类转换为基类的主要内容,如果未能解决你的问题,请参考以下文章