必须使用指针来抽象类导致困难

boo*_*y81 3 c++ abstract-class pointers

我这里的第一个问题......

我想用一个抽象类,A我从中派生类B(和类B2,B3...).我明白为了统一处理它们,我必须使用指向基类的指针,所以这里是类型的变量A*.

在下面的例子中,我想填写函数中aa的类型.因为我只能用引用和变量在年底失去他们的范围,我无法访问的条目的成员中了.vector<A*>ffaamain

什么可以解决这个问题?

#include <vector>
#include <iostream>


class A {
    public:
        virtual int getVar(int, int) = 0;
};

class B : public A {
    public:
        B(std::vector<std::vector<int> > var) : var_(var) {};
        int getVar(int i, int j) { return var_[i][j]; }
    private:
        std::vector<std::vector<int> > var_;
};

void f(std::vector<A*>& aa) {
    std::vector<std::vector<int> > var(1, std::vector<int>(1));
    var[0][0] = 42;

    B b(var);

    aa.push_back(&b);
}

int main() {
    std::vector<A*> aa;

    f(aa);

    std::cout << aa[0]->getVar(0, 0) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 7

B b(var);
aa.push_back(&b);
Run Code Online (Sandbox Code Playgroud)

它正在推送局部变量的地址.这就是问题的原因,因为局部变量在从functon返回时被破坏,但aa仍然包含指向不存在的对象的指针.这样的指针称为悬空指针,用于调用未定义的行为 - 这是C++中最危险和最令人不快的方面之一.

用途new:

aa.push_back(new B(var));
Run Code Online (Sandbox Code Playgroud)

现在它应该工作.

重要提示:不要忘记~A()虚拟:

class A {
    public:
        virtual ~A() {} //MUST DO IT
        virtual int getVar(int, int) = 0;
};
Run Code Online (Sandbox Code Playgroud)

否则,您将无法使用基类型的指针删除派生类型的对象(以明确定义的方式).