C++ 指向派生类的基类指针,位于范围之外

C++ 指向派生类的基类指针,位于范围之外,c++,virtual-functions,derived-class,base-class,C++,Virtual Functions,Derived Class,Base Class,如果我创建一个基类指针数组,在一个作用域中创建一个派生类对象,并将引用传递给该数组,然后正确地调用该作用域中派生类的虚函数,但在该作用域之外,我尝试调用虚函数,它忘记了它是一个派生类。我试着铸造它,但不起作用 class Base{ public: Base(string str) {name = str;} virtual string toString() { return name;} Base& operator=(cons

如果我创建一个基类指针数组,在一个作用域中创建一个派生类对象,并将引用传递给该数组,然后正确地调用该作用域中派生类的虚函数,但在该作用域之外,我尝试调用虚函数,它忘记了它是一个派生类。我试着铸造它,但不起作用

class Base{
    public:
        Base(string str) {name = str;}
        virtual string toString() { return name;}
        Base& operator=(const Base& b) {name = b.name; return *this;}
    private:
        string name;
};
class Derived: public Base{
    public:
        Derived(string str1, string str2) {name = str1; second = str2;}
        virtual string toString() {return name + second;}
        Derived& operator=(const Derived& d) {Base::operator=(d);
                                              second = d.second; return *this;}
    private:
        string name;
        string second;
};
int main(){
    Base* baseArr[5];
    int n;
    cin >> n;
    if(n==1){
        Derived der("Derived", "Class");
        baseArr[0] = &der;
        baseArr[0]->toString() << endl; //this prints out "DerivedClass"
     }
     cout << baseArr[0]->toString(); //this prints out "Derived"
 }
类基{
公众:
基本(字符串str){name=str;}
虚拟字符串toString(){return name;}
Base&operator=(const Base&b){name=b.name;返回*this;}
私人:
字符串名;
};
派生类:公共基{
公众:
派生的(字符串str1,字符串str2){name=str1;second=str2;}
虚拟字符串toString(){return name+second;}
派生&运算符=(const派生&d){Base::operator=(d);
second=d.second;返回*this;}
私人:
字符串名;
弦秒;
};
int main(){
Base*baseArr[5];
int n;
cin>>n;
如果(n==1){
衍生订单(“衍生”、“类别”);
baseArr[0]=&der;

baseArr[0]->toString()您正在调用未定义的行为,因为您正在通过已被破坏的
baseArr[0]
引用对象实例。
der
的生存期不存在于
}
在其作用域的末尾,您不能通过在该点之后存储的指针引用它。

您正在调用未定义的行为,因为您是通过已销毁的
baseArr[0]
引用对象实例。
der
的生存期在
之后不存在
在其作用域的末尾,您不能通过在该点之后存储的指针引用它。

那么,有没有办法将der保留在}之前?当然,将其声明移到
之外如果(…){
作用域,那么它的生存期将延长到
main()
中的最后一个
}
,但是,我的实际代码需要那个if语句。因为我试图创建两个不同的派生类。如果条件为真,则与Derived1类似,如果条件为假,则与Derived2类似,并且两者都从基继承。好的,您可以使用
new
而不是局部变量来分配一个<代码>派生*der=新派生(“派生”、“类”)
然后
baseArray[0]=der。完成后别忘了删除它。它很有效!非常感谢你!关于删除,只删除main或每个派生类末尾的数组可以吗(假设我为它们制作了析构函数)?那么,有没有办法将der保留在}之前?当然,将其声明移到
范围之外,如果(…){
范围,那么它的生存期将延长到
main()
中的最后一个
}
,但是,我的实际代码需要那个if语句。因为我试图创建两个不同的派生类。如果条件为真,则与Derived1类似,如果条件为假,则与Derived2类似,并且两者都从基继承。好的,您可以使用
new
而不是局部变量来分配一个<代码>派生*der=新派生(“派生”、“类”)
然后
baseArray[0]=der。完成后别忘了删除它。它很有效!非常感谢你!关于删除,只删除main或每个派生类末尾的数组可以吗(假设我为它们制作了析构函数)?