使用new分配派生类数组的问题

hig*_*dth 0 c++ derived-class segmentation-fault new-operator dynamic-memory-allocation

我有一个简单的程序

$ cat a.cpp 
#include <iostream>
class MyClass {
    public:
        virtual void check() {
            std::cout << "Inside MyClass\n";
        }
};

class MyClass2: public MyClass {
    public:
        int* a;
        virtual void check() {
            std::cout << "Inside MyClass2\n";
        }
};

int main() {
    MyClass *w, *v;
    w = new MyClass2[2];
    v = new MyClass2;
    std::cout << "Calling w[0].check\n"; w[0].check();
    std::cout << "Calling v->check\n"; v->check();
    std::cout << "Calling w[1].check\n"; w[1].check();
}
$ g++ a.cpp
$ ./a.out 
Calling w[0].check
Inside MyClass2
Calling v->check
Inside MyClass2
Calling w[1].check
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

我认为可以使用new来分配派生类对象.此外,v-> check()似乎工作正常.

Jam*_*lis 5

w = new MyClass2[2]; 
Run Code Online (Sandbox Code Playgroud)

这将创建一个包含两个MyClass2对象的数组.它是类型MyClass2[2].新表达式返回指向此数组的初始元素的指针,并将该指针指定给w.

w[1].check();  
Run Code Online (Sandbox Code Playgroud)

这被视为w指向MyClass对象数组的指针,而不是MyClass2对象数组.

您不能将派生类对象数组视为基类对象数组.如果您希望能够使用派生类对象,则需要一个指针数组:

MyClass** w = new MyClass*[2];
w[0] = new MyClass2;
w[1] = new MyClass2;
Run Code Online (Sandbox Code Playgroud)

  • 我认为你的意思是'MyClass**w = new MyClass*[2];`.对? (3认同)