2014-01-07 123 views
1

我想学习C++中的继承。我写了一些代码来学习虚函数。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

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

1

方法virtual int get_count() const = 0;纯虚拟。你不能创建一个抽象类的对象(换句话说 - 有一个纯虚拟成员)。如果你想创建一个的对象,删除= 0定义功能(带一个空的身体,如果你需要):

virtual int get_count() const{}; 

应该工作。

+0

这不是问题所在。他试图创建一个实例作为主要的第一个变量,这是逻辑错误。应该是A *或A&和派生类的实例。 – SOReader

+0

如果他正在创建实例,因为他希望**? :)如果他想 - 他可以做到。 –

+0

如果是这样,它不应该是纯虚拟的。这是一个设计问题 – SOReader

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; 
} 
0

的答案是技术原因,它不会工作,但有一个更隐蔽的问题在于设计没有意义。你正在创建一个B来为你的A添加一些功能。如果你还创建了一个扩展A的C,你真的想把它变成B吗?

继承的典型例子是动物。斑马和长颈鹿都是动物,因此类层次结构是这样的

class Animal 
{ 
    stuff 
} 

class Zebra : public Animal 
{ 
    more stuff 
} 

class Giraffe : public Animal 
{ 
    different stuff 
} 

它没有多大意义,把斑马变成长颈鹿,不过,即使两者都是动物。