virtual-functions相关内容

如何在UML类图中表示纯虚函数?

我是一个学习C++的学生。我正在为我的程序创建涉及继承和抽象/具体类的UML类关系图,但我不太确定如何表示纯虚拟函数。感谢您的任何帮助,谢谢! UMLUML 标准确实指出,行为特性(例如,方法/操作)可以将其属性isAbstract设置为指示它是抽象的,并且没有实现。isAbstract 推荐答案 但是,没有说明应如何在图表中显示此内容。 根据uml-diagrams.o ..
发布时间:2022-03-10 09:10:21 C/C++开发

铸造给孩子

我实际上想要做的是将构造的 moneypunct 转换为 this question 无需像 this answer 中那样编写复制构造函数. 但为了编写最小、完整、可验证的示例,假设我有这两个类: 父类{上市:父级(复杂& args);父操作符=(const Parent&) = delete;Parent(const Parent&) = 删除;父母()=默认;虚拟无效函数();私人的 ..
发布时间:2022-01-24 16:53:42 C/C++开发

如何使用虚函数在 C++ 中实现多态行为?

我是 C++ 的这些重要特性的新手,我已经在这里阅读了一些关于这些主题的问题/答案,并搜索了一些文档.但我仍然对此感到困惑...... 如果有人能建议我一些好的在线教程或书籍章节,让这些概念变得简单而缓慢,并从基础开始,那就太好了. 另外,如果有人知道一些手头的练习材料,那就太好了. 解决方案 这是我听过的对多态性最好的解释: 这个世界上有很多动物.他们中的大多数都会发出 ..
发布时间:2022-01-24 16:52:52 C/C++开发

C#:有什么方法可以跳过多态性中的一个基本调用?

类 GrandParent{公共虚拟 void Foo() { ... }}类父:祖父{公共覆盖无效Foo(){base.Foo();//做额外的工作}}班级孩子:父母{公共覆盖无效Foo(){//如何跳过 Parent.Foo 并到达 GrandParent.Foo 基地?//做额外的工作}} 如上面的代码所示,我怎样才能让 Child.Foo() 调用 GrandParent.Foo() 而 ..
发布时间:2022-01-24 16:45:16 C#/.NET

为什么虚函数需要通过指针而不是值(对象)传递?

我想我理解虚方法和 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() {}//纯虚 ..
发布时间:2022-01-24 16:30:56 C/C++开发

C++:为什么结构\类需要一个虚拟方法才能成为多态?

以下这个问题,我想知道为什么 C++ 中的 struct\class 必须有一个虚拟方法才能成为多态. 强制使用虚拟析构函数是有道理的,但如果根本没有析构函数,为什么必须要有虚拟方法? 解决方案 因为 C++ 中多态对象的类型基本上是由指向其 vtable 的指针决定的,vtable 是虚函数表.但是,只有在至少有一个虚拟方法时才会创建 vtable.为什么?因为在 C++ 中,你永 ..
发布时间:2022-01-24 16:14:13 C/C++开发

为什么对派生类使用基类指针

类基{......虚空函数1();虚空函数2();};类派生::公共基础{整数函数1();整数函数2();};主函数(){导出d;基数 *b = &d;int k = b->function1()//为什么使用 this 而不是下面的行?int k = d.function1();//有了这个,对虚函数的需求就消失了,对吧?} 我不是 CompSci 工程师,我想知道这一点.如果我们可以避免基类 ..
发布时间:2022-01-24 16:10:47 C/C++开发

“纯虚函数调用"在哪里?崩溃从何而来?

我有时会注意到程序在我的计算机上崩溃并显示错误:“纯虚函数调用". 当无法从抽象类创建对象时,这些程序如何编译? 解决方案 如果您尝试从构造函数或析构函数调用虚函数,可能会导致这些问题.由于您不能从构造函数或析构函数调用虚函数(派生类对象尚未构造或已被销毁),因此它调用基类版本,在纯虚函数的情况下,不会'不存在. (查看现场演示这里) 类基础{上市:基地(){做它();}// ..
发布时间:2022-01-24 15:54:36 C/C++开发

虚函数和vtable是如何实现的?

我们都知道 C++ 中的虚函数是什么,但它们是如何深入实现的呢? 可以在运行时修改甚至直接访问vtable吗? vtable 是否适用于所有类,还是仅适用于至少具有一个虚函数的类? 抽象类是否只是简单地为至少一个条目的函数指针设置了一个 NULL 值? 只有一个虚函数会减慢整个班级的速度吗?还是只调用虚拟函数?如果虚函数实际上被覆盖,速度是否会受到影响,或者只要它是虚函数就 ..
发布时间:2022-01-24 15:46:33 C/C++开发

CPU 架构演变如何影响虚拟函数调用性能?

多年前,我正在学习 x86 汇编器、CPU 流水线、缓存未命中、分支预测和所有爵士乐. 这是一个分为两部分的故事.我阅读了处理器中冗长管道的所有奇妙优势,即指令重新排序、缓存预加载、依赖交错等. 缺点是任何偏离规范的代价都非常大.例如,IIRC 早期千兆赫时代的某个 AMD 处理器每次通过指针 (!) 调用函数时都会受到 40 个周期 惩罚,这显然是正常的. 这不是一个可以忽略的 ..

为什么我们在 C++ 中没有虚拟构造函数?

为什么 C++ 没有虚构造函数? 解决方案 听马的.:) 来自 Bjarne Stroustrup 的 C++ 风格和技术常见问题解答 为什么我们没有虚拟构造函数? 虚拟调用是一种在给定部分的情况下完成工作的机制信息.特别是,“虚拟"允许我们调用一个函数只知道任何接口,而不知道对象的确切类型.到创建对象需要完整的信息.特别是你需要知道您要创建的确切类型.最后,“对构造函数的调用 ..
发布时间:2021-12-30 15:08:02 C/C++开发

C++ 风格:为覆盖的方法添加 virtual 关键字前缀

我一直在与我的同事讨论是在重写的方法前添加 virtual 关键字,还是只在原始基类中添加前缀. 我倾向于在所有虚方法(即涉及虚表查找的方法)前加上 virtual 关键字.我的理由有三个: 鉴于 C++ 缺少覆盖关键字,虚拟的存在关键字至少会通知您该方法涉及查找和理论上可以被覆盖进一步的专业化,或者可能是通过指向更高的指针调用基类. 一直使用这种风格意味着,当你看到一个方法(至 ..
发布时间:2021-12-23 09:15:35 C/C++开发

最终的虚函数有什么意义?

维基百科有以下关于 C++11 final 修饰符的例子: struct Base2 {virtual void f() final;};结构派生2:Base2 {无效 f();//格式错误,因为虚函数 Base2::f 已被标记为 final}; 我不明白引入虚函数并立即将其标记为最终函数的意义.这只是一个不好的例子,还是有更多的例子? 解决方案 通常 final 不会用于虚函数的基 ..
发布时间:2021-12-17 19:28:25 C/C++开发

C++虚函数返回类型

继承的类是否可以实现具有不同返回类型的虚函数(不使用模板作为返回)? 解决方案 在某些情况下,是的,只要返回类型为 ,派生类使用不同的返回类型覆盖虚函数是合法的与原始返回类型协变.例如,请考虑以下内容: class Base {上市:虚拟 ~Base() {}虚拟基*克隆()const = 0;};派生类:公共基础{上市:虚拟派生* clone() const {返回新派生(*this) ..
发布时间:2021-12-17 19:01:14 C/C++开发