草庐IT

System虚拟化

全部标签

c++ - 反汇编多重继承中的虚拟方法。 vtable 是如何工作的?

假设以下C++源文件:#includeclassBaseTest{public:inta;BaseTest():a(2){}virtualintgB(){returna;};};classSubTest:publicBaseTest{public:intb;SubTest():b(4){}};classTriTest:publicBaseTest{public:intc;TriTest():c(42){}};classEvilTest:publicSubTest,publicTriTest{public:virtualintgB(){returnb;}};intmain(){EvilT

c++11 将 std::tuple 解压到虚拟成员函数中

完整故事:我正在尝试构建一个看起来有点像这样的框架:#include#includeusingnamespacestd;//thisclassallowsusertocall"run"withoutanyargsclasssimulation_base{public:intrun(){execute_simulation_wrapped();};protected:virtualintexecute_simulation_wrapped();{return0;};}//thisclassfunnelssomestoredinputsintoasoon-to-be-overriddenm

c++ - 我可以在 C++ 中使用 [] 运算符来创建虚拟数组吗

我有一个庞大的代码库,最初是C语言,多年前移植到C++,它对大量空间数据的大型数组进行操作。这些数组包含表示点的结构和表示曲面模型的三角形实体。我需要重构代码,以便这些实体在内部存储的具体方式因特定场景而异。例如,如果点位于规则的平面网格上,我不需要存储X和Y坐标,因为它们可以即时计算,三角形也可以。同样,我想利用非核心工具,例如STXXL用于存储。最简单的方法是用put和get类型函数替换数组访问,例如point[i].x=XV;成为Pointp=GetPoint(i);p.x=XV;PutPoint(i,p);如您所想,这是对大型代码库进行的非常乏味的重构,在重构过程中容易出现各种

c++ - 基础和派生虚拟析构函数的影响

我对多个虚拟析构函数有了一些重新考虑,尤其是。读后阅读http://blogs.msdn.com/b/oldnewthing/archive/2004/05/07/127826.aspx.假设我有classBase{public:Base();virtual~Base();private:Logger*_logger;};//andclassDerived:publicBase{public:Derived();virtual~Derived();private:Logger*_logger;};在cpp文件中,在每个析构函数中我删除了相应的_logger指针Base::~Base()

c++ - 虚拟多重继承

我偶然发现了这个代码示例:#includeusingnamespacestd;classA{intx;public:A(){x=1;coutThiscodeprintsABABCD我不知道为什么。我认为它会打印AforD:publicA,然后ABforD:publicB,然后ABCforD:publicC,然后是D,但似乎A只打印了两次。这是如何工作的? 最佳答案 基的构建顺序是(忽略虚拟基)从左到右,因为它们是在继承关系中键入的。添加虚拟基础后,它们将以从左到右的深度优先方式首先(在任何非虚拟基础之前)初始化。现在应该可以解释输出

c++ - 当我知道类型时,如何避免虚拟调用?

考虑以下代码片段:structBase{virtualvoidfunc(){}};structDerived1:Base{voidfunc()override{print("1");}};structDerived2:Base{voidfunc()override{print("2");}};classManager{std::vector>items;public:templatevoidadd(){items.emplace_back(newT);}voidfuncAll(){for(auto&i:items)i->func();}};intmain(){Managerm;m.ad

C++ std::system_error 与 common catch std::exception block 的用法

std::system_error处理带有相关错误代码的异常。是否可以使用公共(public)catchblock来获取std::system_error异常消息及其代码?像这样try{//codegeneratingexception}catch(conststd::exception&ex){//catchallstd::exceptionbasedexceptionslogger.log()唯一的方法是直接捕获std::system_error类型并在捕获基本异常类型之前获取其代码吗?广泛使用std::system_error的最佳方法是什么? 最佳答

c++ - 默认创建类 `final`还是给它们一个虚拟的析构函数?

如果将非虚拟析构函数的类用作基类(如果将指针或对基类的引用用于引用子类的实例),则它们是错误的来源。在C++11中添加了final类之后,我想知道设置以下规则是否有意义:每个类都必须满足以下两个属性之一:被标记为final(如果尚未(还)要从中继承)有一个虚拟析构函数(如果它是(或打算)继承)可能在某些情况下,这两个选项都不有意义,但我想可以将它们视为应仔细记录的异常。 最佳答案 可能由于缺少虚拟析构函数而引起的最常见的实际问题是通过指向基类的指针删除了一个对象:structBase{~Base();};structDerived:

c++ - 隐式虚拟性传播的原因是什么?

我只使用C++工作了2到3个月,最近我发现了标识符final,它位于虚函数之后。直到今天,我还相信省略virtual会阻止虚拟性的传播,但我错了。它隐式传播。我的问题是这样的。为什么允许隐式传播?为什么virtual的存在不能使函数成为虚函数而virtual的存在不能使函数不是虚函数?在某些情况下更好吗?还是在虚拟首次引入的那一天?根据Clifford'sanswer,甚至还有一个编译器会在缺少virtual时生成警告。whyisthevirtualityofmethodsimplicitlypropagatedinc我希望上面的链接能回答我的问题,但事实并非如此。----------

c++ - 如何在 C/C++ 中捕获 system() 的结果

这个问题在这里已经有了答案:关闭12年前。PossibleDuplicate:HowcanIrunanexternalprogramfromCandparseitsoutput?你好,有人可以告诉我们如何在执行system()函数时捕获结果吗?实际上,我写了一个显示机器IP地址的c++程序,称为“ipdisp”,我希望当服务器程序执行此ipdisp程序时,服务器捕获显示的IP地址。那么,这可能吗?如果是,怎么办?感谢您的回复