如何使用c ++返回一个抽象类

0 c++ abstract-class pointers return-type derived-class

在使用C++工作时遇到了麻烦.我已经在SO和其他地方尝试了几个答案(比如:从函数中返回一个抽象类,如何使抽象类正确返回另一个抽象类的具体实例?),但我仍然一直有麻烦 - 这些似乎并不完全适合......

我有一个抽象类,派生类:

class AbstractClass {
    virtual std::string virtMethod() = 0;
}

class Derived : public AbstractClass {
    std::string virtMethod();
}
Run Code Online (Sandbox Code Playgroud)

另外,我是一个单独的类,我正在尝试获取抽象类的返回类型(当然,返回派生类的实例).

我尝试过使用指针和引用:

AbstractClass* methodFromOtherClass() {
    if (somethingIsTrue) {
        Derived d = Derived();
        return &d;
    }

    SomeOtherDerived s = SomeOtherDerived();
    return &s;
}
Run Code Online (Sandbox Code Playgroud)

在Xcode中,它给了我警告:

返回与本地变量"d"关联的堆栈内存的地址

我尝试创建一个静态Derived对象,然后无法在调用我的"methodFromOtherClass()"的方法中销毁它.

我也尝试过智能指针(虽然有人可能会指出我明显误用它们):

std::unique_ptr<AbstractClass> methodFromOtherClass() {
    if (somethingIsTrue) {
        Derived d = Derived();
        return std::unique_ptr<AstractClass>(&d);
    }

    SomeOtherDerived s = SomeOtherDerived();
    return std::unique_ptr<AstractClass>(&s);
}
Run Code Online (Sandbox Code Playgroud)

以上,也许不出所料,给了我一个段落错误.

我习惯于在Java中轻松地做到这一点...任何帮助将不胜感激.C++目前对我来说不是一种非常强大的语言,所以它可能是我忽略的非常基本的东西.

tka*_*usl 5

在两次尝试中,您都犯了同样的错误:返回指向局部变量的指针.不要那样做!您需要的是在堆内存中创建类的新实例.

没有std::unique_ptr:

AbstractClass* methodFromOtherClass() {
    if (somethingIsTrue) {
        Derived* d = new Derived();
        return d;
    }

    SomeOtherDerived* s = new SomeOtherDerived();
    return s;
}
Run Code Online (Sandbox Code Playgroud)

AbstractClass *c = obj->methodFromOtherClass();
...
delete c;
Run Code Online (Sandbox Code Playgroud)

或者std::unique_ptr:

std::unique_ptr<AbstractClass> methodFromOtherClass() {
    if (somethingIsTrue) {
        Derived d = new Derived();
        return std::unique_ptr<AbstractClass>(d);
    }

    SomeOtherDerived* s = new SomeOtherDerived();
    return std::unique_ptr<AbstractClass>(s);

    /*
    Or better, with std::make_unique():

    if (somethingIsTrue) {
        return std::make_unique<Derived>();
    }

    return std::make_unique<SomeOtherDerived>();
    */
}
Run Code Online (Sandbox Code Playgroud)

std::unique_ptr<AbstractClass> c = obj->methodFromOtherClass();
...
Run Code Online (Sandbox Code Playgroud)