当前位置: 首页 > 知识库问答 >
问题:

编译时继承类中的隐式虚拟与显式虚拟

辛建业
2023-03-14

TL;DR 我引用的旧代码不符合 C 语言。令人惊讶的是,代码曾经有效。不能在构造函数和解构函数中调用虚拟方法。

我和一位同行讨论了C语言中的<code>virtual</code>关键字。在一个较旧的ubuntu操作系统上,我正在编写一个程序,该程序报告了调用“纯虚拟方法”的错误,这是不应该发生的

class Base {
    virtual ~Base() { this->DoSomethingElse(); }
    virtual bool DoSomething() = 0;
    virtual bool DoSomethingElse() = 0;
};

class Foo : public Base {
    ~Foo();
    bool DoSomething();
    bool DoSomethingElse();
};

// Later...
Base* obj = new Foo();
obj->DoSomething(); // Pure virtual function called SIGABORT
delete obj; // Pure virtual function called SIGABORT

单步执行调试器后,我终于在继承的类上添加了虚拟

class Base {
    virtual ~Base() { this->DoSomethingElse(); }
    virtual bool DoSomething() = 0;
    virtual bool DoSomethingElse() = 0;
};

class Foo : public Base {
    virtual ~Foo();
    virtual bool DoSomething();
    virtual bool DoSomethingElse();
};

// Later...
Base* obj = new Foo();
obj->DoSomething(); // Ok!
delete obj; // Ok!

在告诉我的同龄人之前,我仔细检查了谷歌是否有任何可能表明继承类需要虚拟的东西。他们说,是的,标准中需要虚拟,但编译器大多数时候会自动为继承的类填充虚拟。根据我的理解(我相信大多数程序员),当你想通过多态性覆盖该功能时,虚拟是需要的。但不清楚您是否也需要标记子类函数实现。

我对这个话题缺乏资源感到惊讶。那是什么?现代C编译器中是否隐含了虚拟,标准在哪里描述了这一点?

共有1个答案

汪茂
2023-03-14

重写虚拟函数的函数是虚拟的。这不是问题所在。

问题是对< code > dosomingelse()的调用(有或没有冗余的< code>this-

 类似资料:
  • 主要内容:虚继承(Virtual Inheritance),虚基类成员的可见性多继承(Multiple Inheri tance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。 多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: 图1:菱形继承 类

  • 本文向大家介绍C++多重继承与虚继承分析,包括了C++多重继承与虚继承分析的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式较为全面的讲述了C++的多重继承与虚继承,是大家深入学习C++面向对象程序设计所必须要掌握的知识点,具体内容如下: 一、多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分。同样的,在多重继承(multiple inheritance)关系

  • 我对虚拟函数感到困惑。有人告诉我,父类中的虚拟意味着我可以在子类中覆盖它。但是,如果我省略父类中的虚拟,我仍然可以覆盖它。

  • 在我的“简化”API中,所有响应都是从基本“响应”类派生(继承)的。响应类由一个填充元数据的头和一个包含用户请求的核心数据的主体组成。响应(在JSON中)的布局使得所有元数据都在第一个“层”上,而主体是一个称为“主体”的单一属性 我试图用以下JSON来定义这种关系: 然后,我尝试通过创建从body/header继承的各种body/header类来创建不同的响应,然后创建由相关的header/bod

  • FAQs in section [20]: [20.1] 什么是“虚成员函数”? [20.2] C++ 怎样同时实现动态绑定和静态类型? [20.3] 虚成员函数和非虚成员函数调用方式有什么不同? [20.4] 析构函数何时该时虚拟的? [20.5] 什么是“虚构造函数(virtual constructor)”? 20.1 什么是“虚成员函数”? 从面向对象观点来看,它是 C++ 最重要的特征:

  • 从已有的对象类型出发建立一种新的对象类型,使它部分或全部继承原对象的特点和功能,这是面向对象设计方法中的基本特性之一。继承不仅简化了程序设计方法,显著提高了软件的重用性,而且还使得软件更加容易维护。派生则是继承的直接产物,它通过继承已有的一个或多个类来产生一个新的类,通过派生可以创建一种类族。   继承 基本概念 在定义一个类A时,若它使用了一个已定义类B的部分或全部成员,则称类A继承了类B,并称