以下代码可以很好地编译:
struct A
{
const int a;
virtual void foo() = 0;
};
struct B : A{ };
void A::foo(){ std::cout << "foo" << std::endl; }DEMO
问题是结构A是一个抽象的东西,所以我们不能实例化它。但我们可以将其子类化
struct A
{
const int a;
virtual void foo() = 0;
};
struct B : A{ };
void A::foo(){ std::cout << "foo" << std::endl; }
int main(int argc, char ** argv)
{
B b;
b.foo(); //error: implement pure-virtual
}DEMO
仍然不能使用A的foo实现,我怀疑它永远不会被调用。所以,我不知道这种定义的应用……是的,提供一个虚拟析构函数的定义是有用的,但事实并非如此。
在哪里可以使用纯虚拟的定义?
发布于 2015-06-28 12:59:09
您可以显式调用它。
struct A
{
const int a;
virtual void foo() = 0;
};
struct B : A
{
void foo();
};
void A::foo()
{
std::cout << "A::foo" << std::endl;
}
void B::foo()
{
A::foo(); // here
std::cout << "B::foo" << std::endl;
}
int main(int argc, char ** argv)
{
B b;
b.foo(); // prints A::foo followed by B::foo
}发布于 2015-06-28 12:57:59
您可以从B内部调用它。由于A::foo()是纯虚拟的,因此B需要定义foo:
struct A {
virtual void foo() = 0;
};
void A::foo(){ std::cout << "A::foo() ran" << std::endl; }
struct B : A {
void foo() {
A::foo(); // <--
std::cout << "B::foo() ran" << std::endl;
}
};
int main(int argc, char ** argv)
{
B b;
b.foo();
}发布于 2015-06-28 13:00:13
但是您可以(而且必须)实现(如果B是可实例化的)A的void foo()的覆盖。该实现可以(但绝对不是必需的)调用基本实现:
struct B : public A
{
virtual void foo() {A::foo();}
};我已经实现了这个场景,其中我有一个非常简单的“基础”实现,但要求所有leafs通过链接回这个公共实现来积极地决定是否利用这个基础。
https://stackoverflow.com/questions/31096262
复制相似问题