c++ - 通过其抽象基类的指针返回派生类对象

标签 c++ class pointers virtual

我必须编写一个程序,其中一个函数将通过抽象基类返回派生类,因此当返回到主类时可以访问派生类虚方法。

请记住,我不能更改主程序中的任何内容,因为它不是我编写的。

#include<iostream>
using namespace std;
class A
{
private:
public:
    virtual void DoIt(void)=0;
    A(void){};
    ~A(void){};
};
class B:
        public A
{
private:
    int Num;
public:
    virtual void DoIt(void){Num=7;cout<<"its done";};
    B(void){};
    ~B(void){};
};
A& returnValue(void) 
{
        B item;
    return item;
}
void main()
{
    A& item=returnValue();
    item.DoIt();
}

当我尝试运行它时,最后一行打断了构建,说 DoIt 是一个纯虚函数调用。 有什么想法吗?

最佳答案

您正在返回对局部变量的引用,当 returnvalue 中的调用完成时,该变量将被销毁。请尝试以下操作:

A &returnValue(void) {
    return *(new B);
}

int main() {
    A& item = returnValue();
    item.DoIt();
}

更好的解决方案是返回一个智能指针,让维护main函数的人负责returnvalue返回的对象的生命周期:

#include <memory>
...
std::unique_ptr<A> returnValue(void) {
    return std::unique_ptr<A>(new B);
}

int main() {
    auto item = returnValue();
    item->DoIt();
}

关于c++ - 通过其抽象基类的指针返回派生类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16448893/

相关文章:

c++ - "extern __forceinline "是什么 C++ 习语?

c# - 如何在 C# 和非托管 C++ 库之间传递对指针的引用?

c++ - 类范围和私有(private)成员?

html - 从 html 中删除 id 以重用代码

ruby-on-rails - 类(class)开头的 '::' 如何影响范围 (ruby/rails)?

c - 我只是无法理解这么简单的程序。请帮忙。下面是程序和我的理解的代表

c++ - 为什么在 main() 中声明的指针没有改变?

c++ - 如何在 C++ (Arduino/C++) 中将字符串转换为 uint8_t?

c - 指针和数组语法之间的区别

c - 传递多个参数还是只传递一个 ID?