正在调用内存中对象的虚拟函数



我正试图为一个类创建一个内联的构造函数,它有一个虚拟函数。出于总体目的,函数必须是虚拟的,因为Shape::print将由另一个类调用,而不知道它要寻址的是哪种形状(确切类型(。

我认为这一定是一个与记忆有关的问题。当使用未构造但作为指针的类对象时,如何调用此函数?还是我错过了什么?

#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;
 }

提前感谢,任何帮助都是值得的。

在"内联构造函数"中,您只是在分配内存,而不是初始化它。例如,vtable没有初始化,导致崩溃,因为print是虚拟的,并且它的地址应该在vtable中。

尝试Circle* circ = new Circle(radius);而不是malloc

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

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

return new Circle(radius);

这使得它变得如此琐碎以至于毫无意义。

当使用未构造但作为指针的类对象时,如何调用此函数?

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

无火箭科学

问题是,malloc只分配了足够的原始内存并返回。malloc不会初始化创建的内存。因此,在使用之前必须手动初始化对象的成员。您只对r执行此操作,而不对成员方法print执行此操作。

您应该使用new而不是mallocnew分两步工作

  1. 使用运算符new分配足够的内存(相当于malloc的任务(
  2. 调用对象的构造函数来初始化它,它实际上为成员设置值

最新更新