【问题标题】:c++ inheritance virtual functionsc++继承虚函数
【发布时间】:2014-01-07 22:29:59
【问题描述】:

我正在尝试学习 C++ 中的继承。我写了一些代码来学习虚函数。

#include <iostream>

using namespace std;

class A {
  int a;

  public:
    A() {}
    virtual int get_count() const = 0;
    int get_A() { return a; }
};

class B : public  A{
  public:
    int b;

    B() {}

    B(A& base)
      : b(base.get_count()) {}

    virtual int get_count() const { return 10; }
};

void func(A& base) {
  B derived(base);
  cout << derived.b;
}

int main() {
  A base;
  B derived;

  func(derived);
}

当我尝试编译时出现此错误:

test_inheritance_vir.cpp: In function ‘int main()’:
test_inheritance_vir.cpp:32: error: cannot declare variable ‘base’ to be of abstract type ‘A’
test_inheritance_vir.cpp:5: note:   because the following virtual functions are pure within ‘A’:
test_inheritance_vir.cpp:10: note:  virtual int A::get_count() const

你能告诉我我做错了什么吗?

【问题讨论】:

    标签: c++ inheritance virtual


    【解决方案1】:

    您正在尝试使用A base; 实例化类型 A 的对象。这是不可能的,因为 A 包含纯虚函数。 (get_count()) 假设我尝试调用base.get_count()

    【讨论】:

      【解决方案2】:

      virtual int get_count() const = 0; 方法是纯虚拟。您不能创建抽象类的对象(或者换句话说 - 具有纯虚拟成员)。如果要创建 A 的对象,请删除 = 0define 函数(如果需要,可以使用空主体):

      virtual int get_count() const{};
      

      应该可以。

      【讨论】:

      • 这不是问题。他试图创建 A 实例作为 main 的第一个变量,这是逻辑错误。应该是 A* 或 A& 以及派生类的实例。
      • 如果他创建实例是因为他想要? :) 如果他愿意 - 他可以做到。
      • 如果是这样,它不应该是纯虚拟的。这是一个设计问题
      • 是的,它不应该是纯虚拟的。这就是我在回答中所说的。所以 - 有什么问题吗? :)
      【解决方案3】:

      您实现A(如下)的方式使其成为一个抽象基类。

      class A 
      {
        int a;
      
        public:
          A() {}
          virtual int get_count() const = 0; // this is a pure virtual function
          int get_A() { return a; }
      };
      

      它只能用作指向实现纯虚函数的派生类的指针:

      int main() 
      {
          B derived;
          A* pA = new B; // this is okay
      
          delete pA;
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        上面的答案是它无法工作的技术原因,但还有一个更隐蔽的问题是设计没有意义。您正在创建一个 B 以向您的 A 添加一些功能。如果您还创建一个扩展 A 的 C,您真的想将它变成 B 吗?

        遗传的典型例子是动物。斑马和长颈鹿都是动物,所以类层次结构看起来像这样

        class Animal 
        {
            stuff
        }
        
        class Zebra : public Animal
        {
            more stuff
        }
        
        class Giraffe : public Animal
        {
            different stuff
        }
        

        不过,将斑马变成长颈鹿并没有多大意义,尽管它们都是动物。

        【讨论】:

          猜你喜欢
          • 2015-08-23
          • 2015-08-07
          • 2015-06-23
          • 1970-01-01
          • 2012-04-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多