静态地将父级转换为子级C ++

时间:2017-07-30 17:01:21

标签: c++ casting polymorphism static-cast

我有一个父类和一个子类,它具有父类没有的特定功能。我创建一个Parent类型的向量,并添加一个Child类型的对象。我确定所说的项目是一个孩子,所以我尝试使用static_cast创建一个指向它的指针,以便使用它的子特定功能,但它拒绝转换,给出下面代码中描述的错误。

Company

为什么会这样?这种事情有更好的方法吗?

感谢。

2 个答案:

答案 0 :(得分:3)

  

为什么会发生这种情况

让我们剖析它:

int main()
{
    //I know for a fact that the item is a child
    std::vector<Parent> items;
    items.push_back(Child()); // <<<< You are copying and slicing here

    //Static cast to use child specific function doesn't work
    Child* childPtr = static_cast<Child*>(items[0]);
    childPtr->childSpecificFunction(); // <<<<< undefined behavior

    //Gives intellisence error: no suitable conversion from "Parent" to "Child *" exists
}

合适的修复

int main()
{
    std::vector<std::unique_ptr<Parent>> items;
    items.push_back(std::make_unique<Child>());  // <<< working with pointers,
                                                 //     no slicing.

    Child* childPtr = static_cast<Child*>(items[0].get());
    childPtr->childSpecificFunction();
 }

答案 1 :(得分:0)

实际上,您正在尝试存储对象,然后将其转换为Pointer to Child *

#include <vector>

//Parent Class
class Parent {
public:
    Parent() {};
};

//Child Class
class Child : public Parent
{
public:
    void childSpecificFunction() {};
};

int main()
{
    std::vector<Parent*> items;
    items.push_back(new Child());

    Child* childPtr = static_cast<Child*>(items[0]);
    childPtr->childSpecificFunction();


}

另一种方法是强制转换子对象的地址

#include <vector>

//Parent Class
class Parent {
public:
    Parent() {};
};

//Child Class
class Child : public Parent
{
public:
    void childSpecificFunction() {};
};

int main()
{
    std::vector<Parent> items;
    items.push_back(Child());

    Child* childPtr = static_cast<Child*>(&(items[0]));
    childPtr->childSpecificFunction();

}