相关疑难解决方法(0)

C++ Undefined对vtable和继承的引用

档案啊

#ifndef A_H_
#define A_H_

class A {
public:
    virtual ~A();
    virtual void doWork();
};

#endif
Run Code Online (Sandbox Code Playgroud)

文件Child.h

#ifndef CHILD_H_
#define CHILD_H_

#include "A.h"

class Child: public A {
private:
    int x,y;
public:
    Child();
    ~Child();
    void doWork();
};
#endif
Run Code Online (Sandbox Code Playgroud)

和Child.cpp

#include "Child.h"

Child::Child(){
    x = 5;
}

Child::~Child(){...}

void Child::doWork(){...};
Run Code Online (Sandbox Code Playgroud)

编译器说对vtable有一个未定义的引用A.我尝试了很多不同的东西,但没有一个有效.

我的目标是将类A作为接口,并从头部分离实现代码.

c++ inheritance vtable

29
推荐指数
2
解决办法
8万
查看次数

虚拟表和_vptr存储方案

有人可以解释这个不同类的虚拟表是如何存储在内存中的吗?当我们使用指针调用函数时,他们如何使用地址位置调用函数?我们可以使用类指针获取这些虚拟表内存分配大小吗?我想看看一个类的虚拟表使用了多少内存块.我怎么能看到它?

class Base
{
public:
    FunctionPointer *__vptr;
    virtual void function1() {};
    virtual void function2() {};
};

class D1: public Base
{
public:
    virtual void function1() {};
};

class D2: public Base
{
public:
    virtual void function2() {};
};
int main()
{
    D1 d1;
    Base *dPtr = &d1;
    dPtr->function1();
}
Run Code Online (Sandbox Code Playgroud)

谢谢!提前

c++ vtable vptr virtual-table

6
推荐指数
1
解决办法
897
查看次数

虚拟继承的价格是多少?

这似乎是一个基本问题,但我没有看到它问:

假设以下简单案例:

  • 没有虚拟成员.

  • 虚拟继承用于允许多个路径到同一个基础.

根据访问派生类最多的成员所需的时间,虚拟继承的价格是多少?特别是,如果存在非零价格,它是否仅适用于通过多个路径继承的成员或其他成员?

c++ inheritance virtual-inheritance

5
推荐指数
1
解决办法
138
查看次数

type_info对象存储在哪里?

我从" Inside the C++ Object Model "中读到,type_info对象通常存储在虚拟表的第一个插槽中.但是,我迭代了虚拟表中的成员:

class Base {
public:
    virtual void f() { cout << "Base::f" << endl; }
    virtual void g() { cout << "Base::g" << endl; }
    virtual void h() { cout << "Base::h" << endl; }
};

typedef void(*Fun)(void);

Base b;

(Fun)*((int*)*(int*)(&b)+0); // Base::f()
(Fun)*((int*)*(int*)(&b)+1); // Base::g()
(Fun)*((int*)*(int*)(&b)+2); // Base::h()
Run Code Online (Sandbox Code Playgroud)

从最后三行看,我根本找不到type_info.

c++

3
推荐指数
1
解决办法
1028
查看次数