我正在尝试用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
你能告诉我我做错了吗?
答案 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
}
将斑马变成长颈鹿没有多大意义,尽管两者都是动物。