基类指针指向范围外的派生类

时间:2012-11-01 02:03:04

标签: c++ virtual-functions derived-class base-class

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

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"
 }

有没有办法在范围之外调用派生类的函数?

1 个答案:

答案 0 :(得分:1)

您正在调用未定义的行为,因为您指的是已经被破坏的baseArr[0]对象实例。 der的生命周期在其范围末尾的}之后不存在,并且您无法通过在该点之后存储的指针引用它。