我的基本理解是没有纯虚函数的实现,然而,我被告知可能有纯虚函数的实现。
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;
}
上面的代码可以吗?
让它成为一个带有实现的纯虚函数的目的是什么?
当前回答
'virtual void foo() =0;'语法并不意味着你不能在当前类中实现foo(),你可以。这也并不意味着您必须在派生类中实现它。 在你扇我之前,让我们来看看钻石问题: (注意,是隐式代码)。
class A
{
public:
virtual void foo()=0;
virtual void bar();
}
class B : public virtual A
{
public:
void foo() { bar(); }
}
class C : public virtual A
{
public:
void bar();
}
class D : public B, public C
{}
int main(int argc, const char* argv[])
{
A* obj = new D();
**obj->foo();**
return 0;
}
现在,obj->foo()调用将导致B::foo()和C::bar()。
你看到…纯虚方法不必在派生类中实现(foo()在类C中没有实现-编译器将编译) 在c++中有很多漏洞。
希望我能帮上忙:-)
其他回答
'virtual void foo() =0;'语法并不意味着你不能在当前类中实现foo(),你可以。这也并不意味着您必须在派生类中实现它。 在你扇我之前,让我们来看看钻石问题: (注意,是隐式代码)。
class A
{
public:
virtual void foo()=0;
virtual void bar();
}
class B : public virtual A
{
public:
void foo() { bar(); }
}
class C : public virtual A
{
public:
void bar();
}
class D : public B, public C
{}
int main(int argc, const char* argv[])
{
A* obj = new D();
**obj->foo();**
return 0;
}
现在,obj->foo()调用将导致B::foo()和C::bar()。
你看到…纯虚方法不必在派生类中实现(foo()在类C中没有实现-编译器将编译) 在c++中有很多漏洞。
希望我能帮上忙:-)
纯虚函数有或没有主体仅仅意味着派生类型必须提供它们自己的实现。
如果派生类想要调用基类实现,基类中的纯虚函数体非常有用。
你必须给一个纯虚析构函数一个主体,例如:)
阅读:http://cplusplus.co.il/2009/08/22/pure-virtual-destructor/
(链接中断,使用存档)
如果我问你动物的声音是什么,正确的回答是问哪种动物,这正是纯虚函数或抽象函数的目的,当你不能在基类(animal)中提供函数的实现,但每个动物都有自己的声音。
class Animal
{
public:
virtual void sound() = 0;
}
class Dog : public Animal
{
public:
void sound()
{
std::cout << "Meo Meo";
}
}
需要明确的是,你误解了什么= 0;后有虚函数的意思。
= 0表示派生类必须提供实现,而不是基类不能提供实现。
在实践中,当您将虚函数标记为纯(=0)时,提供定义几乎没有什么意义,因为它永远不会被调用,除非有人通过Base:: function(…)显式地这样做,或者如果基类构造函数调用了所讨论的虚函数。