代码非常简单:
class SuperClass
{
public:
virtual void someMethod() = 0;
};
class SubClass : public SuperClass
{
public:
virtual void someMethod()
{
std::cout << "hello" << std::endl;
}
};
class CallerClass
{
public:
std::vector<SuperClass*> subClasses;
CallerClass()
{
subClasses.push_back(&SubClass());
}
void callMethods()
{
subClasses[0]->someMethod();
}
};
int main(int argx, char**argv)
{
CallerClass cc;
cc.callMethods();
return 0;
}
当我实际调用尝试调用 CallerClass''callMethods()' 中的子类''someMethod()' 时,就会出现问题。在 Visual Studio 中,它只是在该行代码处中断,没有任何解释。我通过将push_back(&SubClass())更改为push_back(new SubClass())解决了这个问题。
我很好奇为什么后者有效而不是前者。我认为这是因为在方法中创建的对象只会存在于该方法中,并且通过使用“new”,实际上是在函数结束后为该对象分配了空间;但我向 SuperClass 添加了一个 int a = 1,并且能够以与“callMethods()”内部类似的方式访问它。
我一定错过了 C++ 的一些基本方面。请通知我。希望这不是太明显的事情。
最佳答案
在
subClasses.push_back(&SubClass());
您正在存储一个指向临时对象的指针,该对象随即被销毁。
然后,当您调用 someMethod 时,您正在调用已删除的无效对象指针上的方法。
与
subClasses.push_back(new SubClass());
您正在存储一个指向有效对象的指针,因此它可以工作。
关于C++:在方法中创建对象并在方法外使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26839389/