我的基本理解是没有纯虚函数的实现,然而,我被告知可能有纯虚函数的实现。
class A {
public:
virtual void f() = 0;
};
void A::f() {
cout<<"Test"<<endl;
}
上面的代码可以吗?
让它成为一个带有实现的纯虚函数的目的是什么?
我的基本理解是没有纯虚函数的实现,然而,我被告知可能有纯虚函数的实现。
class A {
public:
virtual void f() = 0;
};
void A::f() {
cout<<"Test"<<endl;
}
上面的代码可以吗?
让它成为一个带有实现的纯虚函数的目的是什么?
当前回答
使用带有实现主体的纯虚拟方法的一个重要用例是,当您想拥有一个抽象类,但该类中没有任何合适的方法使其成为纯虚拟时。在这种情况下,您可以将类的析构函数设为纯虚函数,并为此放置所需的实现(甚至是空体)。举个例子:
class Foo
{
virtual ~Foo() = 0;
void bar1() {}
void bar2(int x) {}
// other methods
};
Foo::~Foo()
{
}
这种技术使得Foo类是抽象的,因此不可能直接实例化该类。与此同时,您还没有添加一个额外的纯虚方法来使Foo类抽象。
其他回答
纯虚函数有或没有主体仅仅意味着派生类型必须提供它们自己的实现。
如果派生类想要调用基类实现,基类中的纯虚函数体非常有用。
你必须给一个纯虚析构函数一个主体,例如:)
阅读:http://cplusplus.co.il/2009/08/22/pure-virtual-destructor/
(链接中断,使用存档)
是的,这是正确的。在您的示例中,派生自A的类继承了接口f()和默认实现。但是你强迫派生类实现方法f()(即使它只是调用A提供的默认实现)。
Scott Meyers在Effective c++ (2nd Edition)第36项中讨论了这一点,区分接口的继承和实现的继承。项目编号可能在最新版本中发生了变化。
它的优点是它强制派生类型仍然重写方法,但也提供了默认的或添加的实现。
如果我问你动物的声音是什么,正确的回答是问哪种动物,这正是纯虚函数或抽象函数的目的,当你不能在基类(animal)中提供函数的实现,但每个动物都有自己的声音。
class Animal
{
public:
virtual void sound() = 0;
}
class Dog : public Animal
{
public:
void sound()
{
std::cout << "Meo Meo";
}
}