草庐IT

c++ - 有没有办法不继承子类中函数的 "virtualness"?

在C++中是否可以让一个类覆盖一个虚函数,但只有在通过父类(superclass)调用该函数时才具有虚拟分派(dispatch)(即,当它被静态类型为子类的东西调用时不存在)?我知道这不会发生,但有什么方法可以接近吗?想要这样做的原因是我有两个类都公开了一个flush()函数。在我的程序中的绝大多数时间,我直接在我知道类型的子类对象上调用flush(),因此我不需要虚拟分派(dispatch)。但是我想在混合中添加一个父类(superclass),这样我就可以很少将对任一类的实例的引用传递给doSomethingThenFlush()函数,该函数将调用flush()实际上。我知道我可以

没有指针或引用的c++虚函数调用

据我所知,虚函数调用通常需要指针或引用。所以我对下面的代码感到非常惊讶。#includeusingnamespacestd;classB{public:voidrunB(){call();}virtualvoidcall(){cout输出是D有人可以评论为什么这个虚函数调用有效吗?谢谢。 最佳答案 在成员函数内,任何对其他成员函数或变量的引用都通过this指针隐式解析。所以在runB()的定义中,call()实际上意味着this->call()。虚函数调用是使用当前对象的虚表执行的。 关

c++ - 将基类函数标记为 virtual 和 final 有什么意义吗?

这个问题在这里已经有了答案:What'sthepointofafinalvirtualfunction?(11个答案)关闭5年前。在variousexplanationsC++11的final关键字,我看到了这样的例子。classbase{public:virtualvoidf()final;};classderived:publicbase{public:virtualvoidf();//Illegalduetobase::f()declaredfinal.};这实际上是final的有用用法吗?为什么要在基类中声明一个虚函数(暗示它可以在派生类中有用地重写)然后立即将其标记为fina

c++ - 为什么我们不能在 COM 中使用 "virtual inheritance"?

我读过一些模糊的声明virtualinheritance没有提供COM需要的内存结构,所以我们只好使用普通的继承。发明虚拟继承是为了解决菱形继承(钻石问题)。有人可以向我展示这两种继承方法之间内存结构细节差异的图示吗?以及虚拟继承不适合COM的关键原因。最好有照片。非常感谢。 最佳答案 首先,在COM中总是使用虚拟继承的行为。QueryInterface无法返回不同的值,例如IUnknown基指针取决于用于获取它的派生类。但是您是对的,这与C++中的虚拟继承机制不同。C++不使用QueryInterface函数进行向上转换,因此它需

C++ 纯虚多重继承?

我需要有关使用接口(interface)的多重继承的实现的帮助...有一个现有的代码和一个具有很多功能的接口(interface)。这些实例是使用工厂创建的。classIBig{//Lotofpurevirtualfunctions};他的实现:classCBig:publicIBig{//Implementation}我想将界面拆分为多个较小的界面,但它应该在一段时间内与现有代码保持兼容。这是我尝试做的示例:classIBaseA{public:virtualvoidDoA()=0;};classIBaseB{public:virtualvoidDoB()=0;};//Thesame

c++ - 在 OO 设计中避免 RTTI

我最近在某个论坛上看到一个面向对象的设计问题,开始考虑使用RTTI。然而,这一定是糟糕的设计,但我想不出替代方案。这是一个简单的问题:使用OO概念为以下场景创建C++程序-Mydog,namedBuddy,livesinthebackyard.Hebarksatnightwhenheseesacatorasquirrelthathascometovisit.Ifheseesafrog,andheishungry,heeatsit.Ifheseesafrogandheisn'thungry,heplayswithit.Ifhehaseaten2frogsalready,andisstil

C++虚函数实现?

如果我在C++中有:classA{private:virtualintmyfunction(void){return1;}}classB:publicA{private:virtualintmyfunction(void){return2;}}然后,如果我从classB的myfunction定义中删除virtual,是否意味着如果我有一个classC基于classB,我不能覆盖myfunction因为它会被静态编译?此外,我对在这里切换公共(public)和私有(private)时会发生什么感到困惑。如果我将classB中myfunction的定义更改为公开(而classA中的定义保持

c++ - 以编程方式安装 Microsoft 虚拟硬盘 (VHD)

我正在尝试使用Windows7API函数挂载虚拟硬盘(.VHD),但找不到相关函数,是否存在?我正在使用VisualStudio2010在C++中编程,以获取信息。提前致谢;) 最佳答案 这是一个老问题,但仍然没有答案,所以我会提供一个答案,以防有人像我一样偶然发现它。附加VHD有关MSDN[VHD引用]的完整引用:http://msdn.microsoft.com/en-us/library/windows/desktop/dd323700(v=vs.85).aspxOPEN_VIRTUAL_DISK_PARAMETERSopen

c++ - 隐式删除的默认构造函数适用于 C++14

我正在为一些没有编译的代码做一些测试,我发现这段代码:structA{A(int){};virtualvoidfoo()=0;};structB:publicvirtualA{virtualvoidbar()=0;};structC:publicB{C():A(1){}virtualvoidfoo()override{}virtualvoidbar()override{}};intmain(){Cc;return0;}在C++11中无法编译(在g++7.0.1上),'B::B()'被隐式删除,因为默认定义格式不正确,而在C中++14编译成功。我试图找出C++14的哪个新特性允许它工作,

C++ 错误 : object of abstract class type is not allowed: pure virtual function has no overrider

继承有问题。我不知道我做错了什么。FigureGeometry.h#ifndefFIGUREGEOMETRY#defineFIGUREGEOMETRYstaticconstfloatPI=3.14159f;classFigureGeometry{public:virtualfloatgetArea()const=0;virtualfloatgetPerimeter()const=0;};#endifCircle.h#ifndefCIRCLE#defineCIRCLE#include"FigureGeometry.h"classCircle:publicFigureGeometry{fl