C++ 调用内存中对象的虚拟函数

C++ 调用内存中对象的虚拟函数,c++,class,pointers,virtual,C++,Class,Pointers,Virtual,我试图为一个类创建一个内联的构造函数,它有一个虚函数。 出于总体目的,该函数必须是虚拟的,因为另一个类将调用Shape::print,而不知道它所处理的是哪种形状(确切类型) 我知道这一定是某种与记忆有关的问题。当使用未构造但作为指针的类对象时,如何调用此函数?还是我错过了什么 #include <stdio.h> #include <stdlib.h> using namespace std; class Shape { public: virtual vo

我试图为一个类创建一个内联的构造函数,它有一个虚函数。 出于总体目的,该函数必须是虚拟的,因为另一个类将调用
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;
 }
#包括
#包括
使用名称空间std;
阶级形态{
公众:
虚拟空打印(){};
};
类圆:形状{
私人:
INTR;
公众:
圆(整数半径){
这个->r=半径;
}
//我的“内联构造函数”
静态圆*make(整数半径){
圆圈*圆圈=(圆圈*)malloc(圆圈大小);
circ->r=半径;
返回中国保监会;
};
虚拟空打印(){
printf(“%u”,此->r);
};
};
int main(){
圆圈(5);
circObj.print();//工作正常
圆*circPtr=圆::make(10);
circPtr->print();//崩溃
返回0;
}
提前感谢,非常感谢您的帮助。

在您的“内联构造函数”中,您只是分配内存,而不是初始化内存。例如,vtable未初始化,导致崩溃,因为
print
是虚拟的,其地址应在vtable中

尝试
圆*circ=新圆(半径)
而不是“内联构造函数”中的
malloc

,您只是分配内存,而不是初始化内存。例如,vtable未初始化,导致崩溃,因为
print
是虚拟的,其地址应在vtable中

// My "inline-constructor"
static Circle* make(int radius){
    Circle* circ = (Circle*) malloc(sizeof(Circle));
    circ->r = radius;
    return circ;
};
尝试
圆*circ=新圆(半径)而不是
malloc

// My "inline-constructor"
static Circle* make(int radius){
    Circle* circ = (Circle*) malloc(sizeof(Circle));
    circ->r = radius;
    return circ;
};
这不是任何类型的构造函数。这只是一种写错了的工厂方法。它应该只包括

return new Circle(radius);
这使得它变得如此琐碎以至于毫无意义

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

没有火箭科学

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

return new Circle(radius);
这使得它变得如此琐碎以至于毫无意义

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


没有火箭科学

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

您应该使用
new
而不是
malloc
<代码>新建
分两步工作

  • 使用运算符new分配足够的内存(相当于
    malloc
  • 调用对象的构造函数对其进行初始化,这实际上为成员设置了值
    问题是,
    malloc
    只是分配了足够的原始内存并返回它<代码>malloc不会初始化创建的内存。因此,在使用之前,必须手动初始化对象的成员。您只为
    r
    执行此操作,而不是为成员方法
    打印执行此操作

    您应该使用
    new
    而不是
    malloc
    <代码>新建
    分两步工作

  • 使用运算符new分配足够的内存(相当于
    malloc
  • 调用对象的构造函数对其进行初始化,这实际上为成员设置了值
    如果我调用类似于
    (new Circle(10))->print()的东西,“内联构造函数”的更好名称是“工厂函数”
    之后,对象不会从内存中删除吗?此外,在每次
    malloc
    之后,应调用
    free
    ,在每次
    new
    之后,应调用
    delete
    ,以避免内存泄漏。或者使用智能指针。如果我调用
    (新圆圈(10))->print(),那么“内联构造函数”的更好名称应该是“工厂函数”
    之后,对象不会从内存中删除吗?此外,在每次
    malloc
    之后,应调用
    free
    ,在每次
    new
    之后,应调用
    delete
    ,以避免内存泄漏。或者使用智能指针。谢谢你的帮助!谢谢你的帮助!谢谢,我要自己记住这个;-)谢谢,我要自己记住这个;-)