virtual-functions相关内容
在本例中,类Foo和Bar是从库中提供的。我的类Baz从两者继承。 struct Foo { void do_stuff (int, int); }; struct Bar { virtual void do_stuff (float) = 0; }; struct Baz : public Foo, public Bar { void func () {
..
实例化从具有抽象方法的其他类继承的类时,遇到编译器错误C2259。 继承方案有点奇怪和不透明,但由于问题的一些限制,我需要这样做。 继承方案如下: class A { public: enum Animal { CAT, DOG }; enum Color { RED, GREEN }; enum Food { MEAT, FISH }; protect
..
我是一个学习C++的学生。我正在为我的程序创建涉及继承和抽象/具体类的UML类关系图,但我不太确定如何表示纯虚拟函数。感谢您的任何帮助,谢谢! UMLUML 标准确实指出,行为特性(例如,方法/操作)可以将其属性isAbstract设置为指示它是抽象的,并且没有实现。isAbstract 推荐答案 但是,没有说明应如何在图表中显示此内容。 根据uml-diagrams.o
..
我实际上想要做的是将构造的 moneypunct 转换为 this question 无需像 this answer 中那样编写复制构造函数. 但为了编写最小、完整、可验证的示例,假设我有这两个类: 父类{上市:父级(复杂& args);父操作符=(const Parent&) = delete;Parent(const Parent&) = 删除;父母()=默认;虚拟无效函数();私人的
..
我是 C++ 的这些重要特性的新手,我已经在这里阅读了一些关于这些主题的问题/答案,并搜索了一些文档.但我仍然对此感到困惑...... 如果有人能建议我一些好的在线教程或书籍章节,让这些概念变得简单而缓慢,并从基础开始,那就太好了. 另外,如果有人知道一些手头的练习材料,那就太好了. 解决方案 这是我听过的对多态性最好的解释: 这个世界上有很多动物.他们中的大多数都会发出
..
类 GrandParent{公共虚拟 void Foo() { ... }}类父:祖父{公共覆盖无效Foo(){base.Foo();//做额外的工作}}班级孩子:父母{公共覆盖无效Foo(){//如何跳过 Parent.Foo 并到达 GrandParent.Foo 基地?//做额外的工作}} 如上面的代码所示,我怎样才能让 Child.Foo() 调用 GrandParent.Foo() 而
..
我想我理解虚方法和 vtable 的概念,但我不明白为什么将对象作为指针(或引用)传递和按值传递(哪种废弃 vtable 或什么?) 为什么会有这样的工作: 材质* m = 新纹理;聚->setMaterial(m);//如果我一直携带指针,则调用 Texture 中的方法 不是这个?: 材质 m = Texture();聚->setMaterial(m);//如果我传递值,则调用 M
..
Scott 在《Effective C++, 3rd Edition, pg.》上说.43 要创建一个抽象类,我们只需要给它一个纯虚析构函数: class AWOV {//AWOV = "Abstract w/o Virtuals"上市:虚拟〜AWOV()= 0;//声明纯虚析构函数}; 然后,他继续说有一个转折:我们必须为纯虚析构函数提供一个定义: AWOV::~AWOW() {}//纯虚
..
以下这个问题,我想知道为什么 C++ 中的 struct\class 必须有一个虚拟方法才能成为多态. 强制使用虚拟析构函数是有道理的,但如果根本没有析构函数,为什么必须要有虚拟方法? 解决方案 因为 C++ 中多态对象的类型基本上是由指向其 vtable 的指针决定的,vtable 是虚函数表.但是,只有在至少有一个虚拟方法时才会创建 vtable.为什么?因为在 C++ 中,你永
..
类基{......虚空函数1();虚空函数2();};类派生::公共基础{整数函数1();整数函数2();};主函数(){导出d;基数 *b = &d;int k = b->function1()//为什么使用 this 而不是下面的行?int k = d.function1();//有了这个,对虚函数的需求就消失了,对吧?} 我不是 CompSci 工程师,我想知道这一点.如果我们可以避免基类
..
..
我有时会注意到程序在我的计算机上崩溃并显示错误:“纯虚函数调用". 当无法从抽象类创建对象时,这些程序如何编译? 解决方案 如果您尝试从构造函数或析构函数调用虚函数,可能会导致这些问题.由于您不能从构造函数或析构函数调用虚函数(派生类对象尚未构造或已被销毁),因此它调用基类版本,在纯虚函数的情况下,不会'不存在. (查看现场演示这里) 类基础{上市:基地(){做它();}//
..
我们都知道 C++ 中的虚函数是什么,但它们是如何深入实现的呢? 可以在运行时修改甚至直接访问vtable吗? vtable 是否适用于所有类,还是仅适用于至少具有一个虚函数的类? 抽象类是否只是简单地为至少一个条目的函数指针设置了一个 NULL 值? 只有一个虚函数会减慢整个班级的速度吗?还是只调用虚拟函数?如果虚函数实际上被覆盖,速度是否会受到影响,或者只要它是虚函数就
..
多年前,我正在学习 x86 汇编器、CPU 流水线、缓存未命中、分支预测和所有爵士乐. 这是一个分为两部分的故事.我阅读了处理器中冗长管道的所有奇妙优势,即指令重新排序、缓存预加载、依赖交错等. 缺点是任何偏离规范的代价都非常大.例如,IIRC 早期千兆赫时代的某个 AMD 处理器每次通过指针 (!) 调用函数时都会受到 40 个周期 惩罚,这显然是正常的. 这不是一个可以忽略的
..
为什么 C++ 没有虚构造函数? 解决方案 听马的.:) 来自 Bjarne Stroustrup 的 C++ 风格和技术常见问题解答 为什么我们没有虚拟构造函数? 虚拟调用是一种在给定部分的情况下完成工作的机制信息.特别是,“虚拟"允许我们调用一个函数只知道任何接口,而不知道对象的确切类型.到创建对象需要完整的信息.特别是你需要知道您要创建的确切类型.最后,“对构造函数的调用
..
我一直在与我的同事讨论是在重写的方法前添加 virtual 关键字,还是只在原始基类中添加前缀. 我倾向于在所有虚方法(即涉及虚表查找的方法)前加上 virtual 关键字.我的理由有三个: 鉴于 C++ 缺少覆盖关键字,虚拟的存在关键字至少会通知您该方法涉及查找和理论上可以被覆盖进一步的专业化,或者可能是通过指向更高的指针调用基类. 一直使用这种风格意味着,当你看到一个方法(至
..
对于此代码: class B1{上市:虚拟无效 f1() {}};D 类:公共 B1 {上市:无效 f1() {}};int主(){B1 *b1 = 新 B1();D *d = 新 D();返回0;} 编译后,我用g++ -fdump-class-hierarchy得到的vtable是: B1 的 VtableB1::_ZTV2B1:3u 条目0 (int (*)(...))08 (int
..
维基百科有以下关于 C++11 final 修饰符的例子: struct Base2 {virtual void f() final;};结构派生2:Base2 {无效 f();//格式错误,因为虚函数 Base2::f 已被标记为 final}; 我不明白引入虚函数并立即将其标记为最终函数的意义.这只是一个不好的例子,还是有更多的例子? 解决方案 通常 final 不会用于虚函数的基
..
我试图弄清楚当派生类将虚函数声明为私有时会发生什么.下面是我写的程序 #include 使用命名空间标准;A级{上市:虚空函数(){cout
..
继承的类是否可以实现具有不同返回类型的虚函数(不使用模板作为返回)? 解决方案 在某些情况下,是的,只要返回类型为 ,派生类使用不同的返回类型覆盖虚函数是合法的与原始返回类型协变.例如,请考虑以下内容: class Base {上市:虚拟 ~Base() {}虚拟基*克隆()const = 0;};派生类:公共基础{上市:虚拟派生* clone() const {返回新派生(*this)
..