其他分享
首页 > 其他分享> > 如果将虚函数或非虚函数添加到C的基类中,是否必须重新编译整个类层次结构?

如果将虚函数或非虚函数添加到C的基类中,是否必须重新编译整个类层次结构?

作者:互联网

我试图了解一个类的vtable在C语言中的敏感程度,为此,我需要了解对于下面列出的3个变更场景是否需要重新编译整个类层次结构(总共3个头文件).首先,这是我的班级层次结构:

class A {
   public:
   virtual void method1() = 0;
   virtual void method2() = 0;
   virtual ~A() {} 
};

class B : public A {
    public:
    virtual void method1() {};
    virtual void method2() {};
    virtual ~B() {} 
};

class C : public A {
    public:
    virtual void method1() {};
    virtual void method2() {};
    virtual ~C() {} 
};

这是我的情况:

>将非虚拟方法添加到基类A:

void method3() {};

>将带有主体的虚拟方法添加到基类A:

virtual void method3() {};

>将纯虚拟方法添加到基类A:

virtual void method3() = 0;

在方案1中,不对vtable进行任何更改.是否仍然需要重新编译B和C?

在方案2中,是否会针对基数A并因此针对B和C重构vtable?

我知道方案3将强制类B和C提供新方法的实现.因此,必须重新编译整个层次结构.

解决方法:

C一定义规则明确指出,如果要将它们链接在一起,则不同翻译单元(即文件)中实体的定义必须全部相同.因此,如果您更改了某个类的定义,无论是公共的,私有的,虚拟的,非虚拟的,无论如何,使用该定义的所有翻译单位都必须查看新的类定义.这将需要重新编译.

失败的原因是不正确的,但是不需要诊断(链接程序错误).因此,您的项目似乎可以很好地链接.确实,在某些情况下它实际上可能起作用.但是没有任何东西可以保证它们在某些情况下会起作用,而在某些情况下它们不会起作用.

标签:vtable,c,c11,virtual-functions
来源: https://codeday.me/bug/20191012/1897244.html