2017-07-30 66 views
1

我有一个父类和一个子类,它具有父类不具有的特定功能。我创建了一个Parent类型的向量,并向它添加了一个Child类型的对象。我知道这个项目是一个孩子,所以我尝试使用static_cast来创建一个指向它的指针,以便使用它的子特定函数,但它拒绝转换给出下面代码中描述的错误。静态转换父对象C++

#include <vector> 

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

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

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

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

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

这是怎么发生的?有没有更好的方法来处理这种事情?

谢谢。

+5

'的地址//我知道一个事实,即该项目是一个child'它不是。 Google对象切片。 –

+0

实际编译? “智能感知”很愚蠢,除非(背景)索引完成。 – user0042

+0

另外,重读你的书中解释指针的部分,你不能只将一个对象指向自己的指针。 –

回答

2

这究竟是为什么

让我们对它进行解剖:

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(); 
} 
+0

这似乎对我的例子完美的工作。在大型项目中使用该方法之前,我是否应该了解这种方法? –

+0

@JacobOaks我会鼓励你使用完全的解决方案(可能会根据你的用例改变智能指针类型)。没有_reservations_,智能指针是线程安全和安全的,只是使用它们。 – user0042

+0

@JacobOaks在大型项目中应用此功能之前,建议对“static_cast”和“dynamic_cast”进行一点研究。如果你有一个孩子班,你可能会有两个或更多的孩子班(如果没有,为什么还要继承孩子?)并且没办法区分他们。 – user4581301

0

其实,你试图存储对象,然后将它投射到指针以儿童*

#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(); 

}