小编sof*_*ver的帖子

如果将虚函数或非虚函数添加到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() {} 
};
Run Code Online (Sandbox Code Playgroud)

这是我的情况:

  1. 非虚拟方法被添加到基类A:

    void method3() {};
    
    Run Code Online (Sandbox Code Playgroud)
  2. 具有主体的虚拟方法被添加到基类A中:

    virtual void method3() {};
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将纯虚拟方法添加到基类A:

    virtual void method3() = 0;
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

c++ virtual-functions vtable c++11

2
推荐指数
1
解决办法
105
查看次数

如何在C++中调用虚拟析构函数?

我试图看到调用属于长层次结构的类的虚拟析构函数的影响:类A到类E.

奇怪的是,析构函数不会向控制台写任何内容.我首先想到也许它正在发生,因为主要也在退出.因此,我将所有测试代码放在一个名为test()的函数中,并从main()中调用,这样当测试返回时,我会看到析构函数的脚印.但是,没有!控制台上没有"cout"标志出现!

#include <iostream>

using namespace std;

//A constructor cannot be virtual but a destructor can.
class A {
public:
A() {
    cout << "A constructor" << endl;
}
virtual ~A() {cout << "A destructor" << endl;}
};

class B :public A {
public:
    B() {
    cout << "B constructor" << endl;
    }
    virtual ~B() {cout << "B destructor" << endl;}
};

class C :public B {
public:
    C() {
    cout << "C constructor" << endl;
    }
    virtual ~C() {cout …
Run Code Online (Sandbox Code Playgroud)

c++ virtual virtual-destructor c++11

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

rvalue对原始整数的引用何时是短暂的或长寿的?

我用TDM-GCC 4.6.1编译器对rvalue引用做了一些实验,并做了一些我无法用理论解释的有趣观察.我想那里的专家帮我解释一下.

我有一个非常简单的程序,不处理对象,但int原语,并定义了2个函数:foo1(通过rvalue引用返回局部变量)和foo2(按值返回局部变量)

#include <iostream>

using namespace std;

int &&foo1();
int foo2();

int main()
{

int&& variable1 = foo1();
//cout << "My name is softwarelover." << endl;
cout << "variable1 is: " << variable1 << endl; // Prints 5.
cout << "variable1 is: " << variable1 << endl; // Prints 0.

int&& variable2 = foo2();
cout << "variable2 is: " << variable2 << endl; // Prints 5.
cout << "variable2 is still: " << variable2 << endl; // Still prints …
Run Code Online (Sandbox Code Playgroud)

c++ rvalue-reference c++11

0
推荐指数
1
解决办法
415
查看次数

C++中存在内存泄漏多长时间?等效的Java程序有何不同?

这是C++中的一段简单代码,它只为一个名为Foo的类的实例动态分配内存,并且忘记以后释放内存.让我们假设Foo非常简单.

int main() {
  Foo *abcd = new Foo();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于程序终止,它真的是内存泄漏吗?如果我重新运行此程序,先前分配的内存是否可用于分配?

这是等效的Java代码:

public static void main(String[] args) {
  Foo abcd = new Foo();
}
Run Code Online (Sandbox Code Playgroud)

由于程序快速终止,如果垃圾收集器没有足够的时间来释放内存怎么办?如果我重新运行此程序,先前分配的内存是否可用于分配?

c++ java memory-leaks

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