正在调用内存中对象的虚拟函数
Calling a virtual function of in-memory object
我正试图为一个类创建一个内联的构造函数,它有一个虚拟函数。出于总体目的,函数必须是虚拟的,因为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
而不是malloc
。new
分两步工作
- 使用运算符new分配足够的内存(相当于
malloc
的任务( - 调用对象的构造函数来初始化它,它实际上为成员设置值
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数