1

基本クラスのポインター配列を作成し、スコープ内に派生クラス オブジェクトを作成し、配列への参照を渡し、スコープ内の派生クラスの仮想関数を正しく呼び出すが、そのスコープ外では、仮想関数を呼び出してみると、派生クラスだったことを忘れています。キャストしてみましたが、うまくいきません。

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

派生クラスの関数をスコープ外で呼び出す方法はありますか?

4

1 に答える 1

1

すでに破棄されているオブジェクト インスタンスを参照しているため、未定義の動作を呼び出しています。baseArr[0]の有効期間は、そのスコープの最後にder存在しません}。その時点以降に保存したポインターを介して参照することはできません。

于 2012-11-01T02:04:35.347 に答える