我有一个父类和一个子类,它具有父类没有的特定功能。我创建一个Parent类型的向量,并添加一个Child类型的对象。我确定所说的项目是一个孩子,所以我尝试使用static_cast创建一个指向它的指针,以便使用它的子特定功能,但它拒绝转换,给出下面代码中描述的错误。
Company
为什么会这样?这种事情有更好的方法吗?
感谢。
答案 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();
}