相关疑难解决方法(0)

涉及私人继承的C风格的向上和向下倾斜

请考虑以下代码: -

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保证是好的吗?

提前致谢

c++ inheritance casting

6
推荐指数
2
解决办法
3535
查看次数

dynamic_cast问题:typeid对象不相等,但名称相等

我发现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)

c++ dynamic-cast typeid

6
推荐指数
1
解决办法
1914
查看次数

标签 统计

c++ ×2

casting ×1

dynamic-cast ×1

inheritance ×1

typeid ×1