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

c++ - 多态中,为什么要在基类中将虚函数声明为纯虚函数 或者 给出虚函数定义呢?

盛浩阔
2023-04-29
class Base {
public:
    virtual void show() {
      printf("Base\n");
    }
    //为什么需要声明为纯虚函数
    //virtual float get_num() = 0;
    virtual float get_num() { return 0;};
};

class B1 : public Base {
public:
    B1():num(58){};
    void show() {
      printf("B1\n");
    }
    float get_num() {
      return num;
    }
private:
    float num;
};

int main() {
  Base* base = new B1;
  //B1 b1;
  //Base* base = &b1;
  base->show();

  float num = base->get_num();
  printf("num=%f\n", num);
  return 0;
}

DF6B3091-72FF-448E-B957-2D27BE43B221.png

做如下修改:
D39EB5E8-11EE-4E13-982E-54F4E8155B9B.png

共有1个答案

李嘉胜
2023-04-29

还有纯虚函数的类是不能直接生成对象的。如果不希望其直接生成对象化,而是只能生成子类的对象,那么就可以在里面放几个纯虚函数。

纯虚函数有没有实现也是看需求的。纯虚函数可以没有实现。但是如果有必要提供一个默认实现,那也可以有实现,供子类使用。

 类似资料:
  • 本文向大家介绍C++中虚函数与纯虚函数的用法,包括了C++中虚函数与纯虚函数的用法的使用技巧和注意事项,需要的朋友参考一下 本文较为深入的分析了C++中虚函数与纯虚函数的用法,对于学习和掌握面向对象程序设计来说是至关重要的。具体内容如下: 首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承、动态绑定。通过数据抽象,可以使类的接口与实现分离,使

  • 为什么一个虚函数在派生类中默认是虚的,甚至不可能在派生类中完全移除虚性,这有什么好的理由吗? 我希望这种行为的原因与我不希望默认情况下每个函数都是的原因相同。编译器可能会生成牺牲性能的vtables。 基类应该有一个vtable(我想要多态性在那里),但派生类没有vtable(我不希望多态性在那里,为什么我要那样,只是因为它派生了一个具有多态性的类?)。 我想解决的问题是更好地理解虚函数。我只是没

  • 本文向大家介绍c++中虚函数和纯虚函数的作用与区别,包括了c++中虚函数和纯虚函数的作用与区别的使用技巧和注意事项,需要的朋友参考一下 虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。 纯

  • 本文向大家介绍C++ 虚函数和纯虚函数的区别分析,包括了C++ 虚函数和纯虚函数的区别分析的使用技巧和注意事项,需要的朋友参考一下 首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函

  • 我正在学习面向对象的C,并有一个关于虚拟/纯虚拟和多级继承的问题。 假设我有这样的简单代码: 我的理解是,除非getWidth被指定为虚拟,否则多态将使用“Base”类的函数。我的意思是r-的最终调用 在这种情况下,我注意到如果我删除Shape中的纯虚拟声明,我们会得到我刚才描述的行为。在基类中有一个纯虚函数会自动使该函数的所有定义都是虚的吗?

  • 在 C++中,可以将虚函数声明为纯虚函数,语法格式为: virtual 返回值类型 函数名 (函数参数) = 0; 纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上 ,表明此函数为纯虚函数。 最后的 并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。 包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。