我最近才知道,在C ++中,纯虚函数可以有select地拥有一个主体。 什么是这种function的真实世界的用例?
可能重复: C ++静态虚拟成员? 我们可以有一个静态的虚拟function? 如果不是,那么为什么? class X { public: virtual static void fun(){} // Why we cant have static virtual function in C++? };
c#中虚函数的实际用法是什么?
在堆栈溢出后检查C ++ 11中的对象types ,我有评论: 在C ++ 11中,你实际上想要做virtual ~A() = default; 否则,你将失去implict构造函数。 什么是virtual ~A() = default; 对于? 如何隐式地移动构造函数与virtual ~A() {} ?
有没有一个很好的理由不申报一个类的虚拟析构函数? 你应该什么时候专门避免写一个?
我有一个虚拟函数的基类,我想在派生类中重写该函数。 有没有办法让编译器检查,如果我在派生类中声明的函数实际上覆盖了基类中的函数? 我想添加一些macros或确保我没有意外地声明一个新的函数,而不是重写旧的。 以这个例子: class parent { public: virtual void handle_event(int something) const { // boring default code } }; class child : public parent { public: virtual void handle_event(int something) { // new exciting code } }; int main() { parent *p = new child(); p->handle_event(1); } 这里调用parent::handle_event()而不是child::handle_event() ,因为孩子的方法没有使用const声明,因此声明了一个新的方法。 这也可能是函数名称中的拼写错误或参数types中的一些细微差别。 如果基类的接口发生变化,并且某些派生类没有更新以反映变化,也很容易发生。 有没有办法避免这个问题,我可以不知何故告诉编译器或其他工具来检查这个对我? 任何有用的编译器标志(最好用于g ++)? […]
用下面给出的结构定义… struct A { virtual void hello() = 0; }; 方法1: struct B : public A { virtual void hello() { … } }; 方法2: struct B : public A { void hello() { … } }; 这两种方法重写hello函数有没有区别?
假设我有Foo和Bar这样的课程: class Foo { public: int x; virtual void printStuff() { std::cout << x << std::endl; } }; class Bar : public Foo { public: int y; void printStuff() { // I would like to call Foo.printStuff() here… std::cout << y << std::endl; } }; 正如在代码中注释的,我希望能够调用我重写的基类的函数。 在Java中有super.funcname()语法。 这是可能的C + +?
对于这个代码: class B1{ public: virtual void f1() {} }; class D : public B1 { public: void f1() {} }; int main () { B1 *b1 = new B1(); D *d = new D(); return 0; } 编译之后,我用g++ -fdump-class-hierarchy获得的vtable是: Vtable for B1 B1::_ZTV2B1: 3u entries 0 (int (*)(…))0 8 (int (*)(…))(& _ZTI2B1) 16 B1::f1 Vtable […]
接口中的C#方法是在不使用virtual关键字的情况下声明的,并且在派生类中override而不使用override关键字。 这是有原因吗? 我认为这只是一种语言方便,显然CLR知道如何处理这个问题(方法在默认情况下不是虚拟的),但是还有其他的技术原因吗? 这是派生类生成的IL: class Example : IDisposable { public void Dispose() { } } .method public hidebysig newslot virtual final instance void Dispose() cil managed { // Code size 2 (0x2) .maxstack 8 IL_0000: nop IL_0001: ret } // end of method Example::Dispose 请注意,该方法在IL中被声明为virtual final 。