c ++继承虚函数

时间:2014-01-07 22:29:59

标签: c++ inheritance virtual

我正在尝试用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

你能告诉我我做错了吗?

4 个答案:

答案 0 :(得分:4)

您正尝试使用A base;实例化A类型的对象。由于A包含纯虚函数,因此无法实现。 (get_count())假设我尝试拨打base.get_count()

答案 1 :(得分:1)

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

virtual int get_count() const{};

应该有用。

答案 2 :(得分:1)

您实现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;
}

答案 3 :(得分:0)

上面的答案是技术上的原因,为什么它不起作用,但有一个更阴险的问题,因为设计没有意义。你正在创建一个B来为你的A添加一些功能。如果你还创建一个扩展A的C,你真的想把它变成B吗?

继承的典型例子是动物。 Zebra和Giraffe都是Animal,所以类层次结构看起来像这样

class Animal 
{
    stuff
}

class Zebra : public Animal
{
    more stuff
}

class Giraffe : public Animal
{
    different stuff
}

将斑马变成长颈鹿没有多大意义,尽管两者都是动物。