获取派生类以显示与派生类的父类具有聚合关系的抽象类中的变量的 C++ 错误
Posted
技术标签:
【中文标题】获取派生类以显示与派生类的父类具有聚合关系的抽象类中的变量的 C++ 错误【英文标题】:C++ Error getting the derived class to display a variable in a abstract class that has a aggregation relation with the parent of the derived class 【发布时间】:2015-06-23 00:57:16 【问题描述】:我试图让我的派生类(humanplayer) 使 abstract(Vector) 的变量成员函数等于“hi”,以便我可以显示它,但编译器的行为很奇怪,并说 EXC_BAD_ACCESS(code=EXC_I386_GPFLT )。
这是我的头文件:
#ifndef __testing_more_stuff__vector__
#define __testing_more_stuff__vector__
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Vector//abstract class
public:
void setName(string name_holder);
virtual void test()=0;
protected:
string name;
;
class player//base class that has an aggregation relationship with vector
protected:
Vector *molo;
;
class humanplayer:public player//derived class of player
public:
void play();
;
#endif
这是我的实现文件:
#include "vector.h"
void Vector::setName(string name_holder)
name=name_holder;
cout<<name<<endl;
void humanplayer::play()
molo->setName("hi");//since humanplayer inherits from player it should be able to set name to hi and print it out
这是我的测试/主文件:
#include "vector.h"
int main()
humanplayer x;
x.play();
【问题讨论】:
你初始化 molo 了吗?我问是因为发布的代码都没有这样做。 @drescherjm 我不明白为什么我需要初始化 molo。事实上我什至不知道我会初始化它,因为它的类型是向量(抽象类),所以它甚至可以是什么值? molo 是一个指向向量的指针。在将 molo 指向 Vector 对象之前,您不能使用它。您可能想使用新的。 那么它可能是什么值?当您尝试取消引用未初始化的指针 molo 时,可能会导致程序崩溃的一些随机垃圾值。 【参考方案1】:在humanplayer::play()
你说:
molo->setName("hi")
但是,molo
的类型为 Vector
,它是一个抽象基类指针。
一些事情:
-
您没有任何派生自
Vector
的具体类
您永远不会将molo
初始化为molo = new VectorDerivedClass()
之类的东西
您没有默认将molo
初始化为nullptr
,也没有检查它。您的 string
分配是未定义的行为。
您必须有一个来自Vector
的具体派生类。并且您必须先使用 new
实例化指针,然后再尝试对其进行任何操作。
多态的好处是你可以有一个指向抽象基类的指针。该指针可以分配给任何动态分配的派生类。实际上,指针强制执行一个接口;派生类保证在抽象基中实现纯虚函数(并继承您在基中提供定义的那些)。
缺点是您必须从类继承,并且对virtual
函数的调用必须通过虚拟表 (vtable),这是一种间接方式,速度稍慢。
【讨论】:
以上是关于获取派生类以显示与派生类的父类具有聚合关系的抽象类中的变量的 C++ 错误的主要内容,如果未能解决你的问题,请参考以下文章