C++访问抽象类指针向量的子类的成员
C++ accessing member of subclass of abstract class pointer vector
此处的错误:
Rocket.cpp:31:16: error: no member named 'getThrust' in 'RocketPart'
rocket[0]->getThrust();
当我想用rocket[i]->getThrust()
通过vector<RocketPart*> rocket
从类Engine
访问getThrust()
时,我会从问题的顶部收到错误消息。我做错了什么?是否可以通过rocket[index]->getThrust((访问它?
类RocketPart
中没有函数getThrust()
,这就是调用函数的向量不起作用的原因。如果getThrust()
是一个通用例程,将在从它继承的类中使用,那么您应该将它作为一个虚拟函数添加到基类中,如下所示:
class RocketPart {
public:
RocketPart();
RocketPart(const RocketPart& orig);
virtual ~RocketPart();
virtual float getThrust();
virtual void print() = 0;
protected:
// some members
};
您收到的错误是正确的:类RocketPart
中没有名为getThrust
的函数。您可以:
- 在
RocketPart
类中添加一个virtual float getThrust()
。这可能不是一个好的解决方案,因为并非所有的RocketPart
都能包含推力;但是,您可以简单地从中创建return 0
,或者使其成为一个纯虚拟函数(这意味着您将不再创建RocketPart
对象 -
dynamic_cast
将您的RocketPart
对象转换为Engine
。这可以通过以下方式完成:for (size_t r = 0; r < rocket.size(); ++r) { if (const Engine* engine = dynamic_cast<Engine*>(rocket[r])) { // able to successfully convert this RocketPart into an Engine engine.getThrust(); } }
您将无法投射任何不是Engine
的RocketPart*
rocket[0]->getThrust();
你需要写:
Engine *pPart = (Engine *) rocket[i]; //you can use also static_cast<> or dynamic_cast<>
pPart->getThrust();
使用cast时要小心:如果rocket[i]不是Engine,程序很可能会崩溃。
您需要添加
virtual float getThrust() = 0;
在您的RocketPart
课程中。此外,我认为绝对没有理由使用虚拟继承(只有当您从多个类继承并且存在钻石问题时才需要使用虚拟继承(,因此:
class Engine : virtual public RocketPart {
你应该可以接受:
class Engine : public RocketPart {
如果您的示例源代码不仅仅是一个示例(您正在泄漏Engine
对象,也许vector<shared_ptr<Engine>>
会是一个更好的主意?(
Engine* engine = dynamic_cast<Engine>(rocket[index]);
if (engine) {
engine->getThrust();
}
考虑到dynamic_cast的使用通常意味着糟糕的设计。
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 初始化依赖于子类的继承类的常量类成员
- C++:在子类中扩展静态 STL 容器/映射成员?
- 从子类访问模板类成员时出现"找不到标识符"错误
- 如何访问子类的新成员函数?
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 如何从子类的构造函数初始化父类的私有成员
- 父类和子类中的 C++ 同名成员
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- C++ 类成员函数的函子模板
- 构造添加了成员变量的子类
- C++基类指针调用子虚函数,为什么基类指针可以看到子类成员
- 如何访问存储在父类中的子类成员
- B2Draw子类成员函数未调用
- 带模板的继承(访问子类成员函数内父类的变量和对象)
- 如何访问子类成员
- 使用指向无法dynamic_cast的基 abstact 类的指针访问子类成员
- 非静态/静态/全局/子类成员的初始化顺序
- 如何在c++中获取子类成员
- 使用auto循环vector时使用子类成员