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
<代码>新建
分两步工作
malloc
)问题是,
malloc
只是分配了足够的原始内存并返回它<代码>malloc不会初始化创建的内存。因此,在使用之前,必须手动初始化对象的成员。您只为r
执行此操作,而不是为成员方法打印执行此操作
您应该使用new
而不是malloc
<代码>新建
分两步工作
malloc
)如果我调用类似于
(new Circle(10))->print()的东西,“内联构造函数”的更好名称是“工厂函数”
之后,对象不会从内存中删除吗?此外,在每次malloc
之后,应调用free
,在每次new
之后,应调用delete
,以避免内存泄漏。或者使用智能指针。如果我调用(新圆圈(10))->print(),那么“内联构造函数”的更好名称应该是“工厂函数”
之后,对象不会从内存中删除吗?此外,在每次malloc
之后,应调用free
,在每次new
之后,应调用delete
,以避免内存泄漏。或者使用智能指针。谢谢你的帮助!谢谢你的帮助!谢谢,我要自己记住这个;-)谢谢,我要自己记住这个;-)