Я пытаюсь имитировать концепцию vptr/vtable. У меня есть 3 вопроса, касающиеся следующих:Виртуальный указатель таблицы и моделирование виртуальной таблицы
1. Я не определили конструктор для класса FOO, который должен быть хорошо, как можно увидеть внутри основной (Foo *ptr= new FOO
ОК). Но когда я создаю объект в куче для того же самого внутри FooVtable :: bar(), он жалуется на отсутствие соответствующего конструктора по умолчанию. Зачем?
2. я вижу, что точки vptr в какой-то адрес (даже если нет new FooVTable
сделано для vptr, я думаю, к т е р по умолчанию это делает. Это ожидается?), FooVtable::bar
становится званых, но соиЬ оленья кожа напечатать заявление. Зачем?
3. Внутри callsomeFun(), я звоню foo->vptr->bar
. Что я пытаюсь достичь здесь в том, что vptr->bar
часть foo->vptr-> Бар должен фактически назвать указатель на функцию-член Foo :: бар(), который я предполагаю разве непосредственно возможно, следовательно, Я объявил void bar(Foo* foo)
, внутри которого я собираюсь позвонить Foo:bar
через ptr. Я подхожу к нему правильно, или есть лучший способ приблизиться к этому?
class Foo;
struct FooVtable {
void bar(Foo* foo)
{
//Foo *ptr = new Foo; //Why does this throw error as No Default constructor?
cout<"FooVTable : bar"; //Doesnt get printed even though gets called
}
};
struct Foo {
FooVtable* vptr;
void bar(Foo *foo)
{
cout<<"Foo : bar";
}
};
int callSomeFun(Foo* foo) {
foo->vptr->bar(foo);
return 0;
}
int main()
{
Foo *ptr=new Foo;
callSomeFun(ptr);
return 0;
}
Настоящая версия vtable не содержит фактических функций, а указывает на функции. И эти функции возьмут указатель 'this *' как первый параметр. –