调用内存中对象的虚函数

时间:2014-06-02 10:52:46

标签: c++ class pointers virtual

我正在尝试为一个具有虚函数的类创建一个内联构造函数。 出于总体目的,该函数必须是虚拟的,因为Shape::print将由另一个类调用,而不知道它正在处理的Shape的类型(确切类型)。

我看到这必须是某种与内存相关的问题。当我使用未构造的Class-Object作为指针时,如何调用此函数?或者我错过了其他什么?

#include <stdio.h>
#include <stdlib.h>

using namespace std;

class Shape {
public:
    virtual void print(){};
};

class Circle : Shape {
private:
    int r;
public:
    Circle(int radius){
        this->r = radius;
    }

    // My "inline-constructor"
    static Circle* make(int radius){
        Circle* circ = (Circle*) malloc(sizeof(Circle));
        circ->r = radius;
        return circ;
    };

    virtual void print(){
        printf("%u", this->r);
    };
};

int main(){
    Circle circObj(5);
    circObj.print(); // Works fine    
    Circle* circPtr = Circle::make(10);
    circPtr->print(); // Crashes    
    return 0;
 }

提前致谢,任何帮助都是合理的。

3 个答案:

答案 0 :(得分:3)

在你的“inline-constructor”中,你只是分配内存,而不是初始化它。例如,vtable未初始化,导致崩溃,因为print是虚拟的,并且其地址在vtable中是预期的。

尝试使用Circle* circ = new Circle(radius);代替malloc

答案 1 :(得分:2)

// My "inline-constructor"
static Circle* make(int radius){
    Circle* circ = (Circle*) malloc(sizeof(Circle));
    circ->r = radius;
    return circ;
};

这不是任何一种构造函数。这只是一个错误的工厂方法。它应该只包括

return new Circle(radius);

这使得它变得毫无意义,完全没有意义。

  

如果在使用未构造的Class-Object但是作为指针使用时,如何调用此函数?

Shape* shape = ....; // for example, new Circle(...)
shape->print();

没有火箭科学

答案 2 :(得分:1)

问题是,malloc只分配足够的 raw 内存并将其返回。 malloc未初始化已创建的内存。因此,必须在使用前手动初始化对象的成员。您只对r执行此操作,但对成员方法print执行此操作。

您应该使用new代替mallocnew分两步完成

  1. 使用 operator new 分配足够的内存(malloc的等效任务)
  2. 调用对象的构造函数来初始化它,它实际上为成员设置了值。