请考虑以下代码: -
class A {};
class B : private A {};
B* bPtr1 = new B;
// A* aPtr1 = bPtr1; // error
// A* aPtr2 = static_cast<A*>(bPtr1); // error
A* aPtr3 = (A*)bPtr1;
B* bPtr2 = (B*)aPtr3;
Run Code Online (Sandbox Code Playgroud)
C样式转换丢弃了私有继承,而隐式和static_cast失败(也dynamic_cast).为什么?如果C风格的强制转换只是一点点,那么C++强制转换是如何实现的,即它们如何知道内存占用的继承类型?
在将bPtr1转换为aPtr3之后,我将不得不再使用另一个C风格的转换向下转换为B static_cast并且dynamic_cast失败.那么,bPtr2保证是好的吗?
提前致谢
我发现dynamic_cast在我期望它的情况下不起作用,并且typeid在运行时查看对象使得情况更加清晰.我只想要从基础到派生的演员,我无法弄清楚为什么它不起作用.
我有一个这样的类结构:
class BoundaryCondition {
public:
virtual void DoSomething() = 0;
virtual ~BoundaryCondition() { /* * */ }
}
class ReflectingBc : BoundaryCondition {
public:
virtual void DoSomething();
}
class MarshakBc : BoundaryCondition {
public:
virtual void DoSomething();
MarshakBc(double value);
void changeValueLaterOn(double value);
private:
double value_;
}
Run Code Online (Sandbox Code Playgroud)
我(基本上)有一个std::vector<BoundaryCondition*>代表问题部分边界条件的东西.我希望能够接受它,vector并且对于其中的所有MarshakBc对象,请致电changeValueLaterOn.所以我有一个看起来像的循环
for (std::vector<BoundaryCondition*>::iterator bc = bcPtrs_.begin();
bc != bcPtrs_.end(); ++bc)
{
if (std::string(typeid(MarshakBc).name()) == std::string(typeid(**bc).name()) )
{
std::cerr << "SAME! "; …Run Code Online (Sandbox Code Playgroud)