44得票9回答
如何检测C++虚函数是否在派生类中被重新定义

简述: 从一个指向派生类实例的 C++ 基类指针,如何在运行时确定一个非纯虚函数(在基类中有实现)是否在派生类中被重新实现? 背景: 我正在编写一个 C++ 库来解决某些数学方程的类问题。这个库提供了一个名为 Equation 的类,其中包含几个虚函数,用户可以将其用作要解决的特定方程的基类...

44得票3回答
如果我不理会警告“隐藏继承成员。为了使当前成员覆盖该实现……”会发生什么?

这可能是一个微小的细节,但它涉及到编译器在你执行如下操作时发出的警告:class A { public virtual void F() { } } class B : A { public void F() { } } 然后你会得到以下警告: 'EomApp1.B.F()'...

42得票3回答
虚函数可以是constexpr吗?

以下代码中的虚函数 X::f() 是否可以被调用?struct X { constexpr virtual int f() const { return 0; } }; 如何成为constexpr?

40得票9回答
你能在C++中缓存虚函数查找吗?

当我在抽象基类指针上调用虚函数foo()时,mypointer->foo()。当我的应用程序启动时,它根据文件的内容选择实例化特定的具体类并将mypointer分配给该实例。在应用程序的其余生命周期中,mypointer将始终指向该具体类型的对象。我无法知道这个具体类型是什么(它可能是由动态加...

40得票9回答
模板还是抽象基类?

如果我想让一个类具有适应性,并且允许从外部选择不同的算法 - 在C++中最好的实现方式是什么? 我主要看到两种可能性: - 使用抽象基类并传递具体对象 - 使用模板 这里是一个小例子,实现了各个版本: 版本1: 抽象基类class Brake { public: virtual voi...

38得票1回答
CPU架构的演进如何影响虚拟函数调用性能?

多年前,我学习x86汇编语言、CPU流水线、缓存未命中、分支预测等相关知识。 这是一个双重结局的故事。我了解了处理器长流水线的所有优点,如指令重新排序、缓存预加载、依赖项交错等等。 不利的一面是任何偏离正常情况的操作都是非常昂贵的。例如,如果使用指针调用函数,早期几GHz时代的某个AMD处...

37得票4回答
Expression.Compile和Lambda的性能比较,直接调用 vs 虚拟调用

我很好奇在代码中,Expression.Compile的性能如何与lambda表达式以及直接方法使用相比,还有直接方法调用和虚拟方法调用的比较(伪代码):var foo = new Foo(); var iFoo = (IFoo)foo; foo.Bar(); iFoo.Bar(); (()...

37得票4回答
使用智能指针实现返回类型协变

在 C++ 中我们可以这样做:struct Base { virtual Base* Clone() const { ... } virtual ~Base(){} }; struct Derived : Base { virtual Derived* Clone() co...

35得票5回答
重载虚函数和隐藏非虚函数有什么区别?

在给定的代码片段中,这些函数调用有什么区别?什么是函数隐藏?什么是函数重写?它们与函数重载有何关系?两者之间有什么区别?我找不到一个好的地方来描述这些内容,所以在这里询问,以便我可以整合信息。class Parent { public: void doA() { cout <...

34得票3回答
用protected覆盖了protected internal!

这是一个关于问题的扩展,该问题一个小时前被提出。 当我们在派生类中重写虚拟方法时,无法修改访问修饰符。请考虑 System.Web.UI 命名空间中的 Control 类。public class Control : IComponent, IDisposable,... { pro...