想问下C++纯虚函数相比于虚函数的直接作用
3个回答
展开全部
我没找到官方的定义,以下是我的理解
虚函数:在c++中,以virtual修饰的函数为虚函数,可在它的子类中被重写,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。是为了实现多态的概念。
纯虚函数:只定义函数,并不在基类中去实现它,而是在它在子类中去实现功能。为后来的函数定义一个框架,防止出现不安全因素;
虚函数:在c++中,以virtual修饰的函数为虚函数,可在它的子类中被重写,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。是为了实现多态的概念。
纯虚函数:只定义函数,并不在基类中去实现它,而是在它在子类中去实现功能。为后来的函数定义一个框架,防止出现不安全因素;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
比如说你要开发一个class
A。你同事小明要开发一个class
B
:
public
A。class
A里面有一个function叫getName。A是一个抽象里,并没有具体的空间保存name。这时候你有两个选择。
选择1:
class
A
{
public
virtual
std::string
getName()
{}
//
返回一个空函数。等子类来覆盖。
}
但是你的同事小明很粗心,总是忘记覆盖。结果导致class
B调用的还是A::getName().
选择2:
class
A{
public
virtual
std::string
getName()
=
0;
//纯虚函数,子类必须实现!
}
这样,无论小明多粗心。如果他的类里没有实现getName(),编译器会报错的。
A。你同事小明要开发一个class
B
:
public
A。class
A里面有一个function叫getName。A是一个抽象里,并没有具体的空间保存name。这时候你有两个选择。
选择1:
class
A
{
public
virtual
std::string
getName()
{}
//
返回一个空函数。等子类来覆盖。
}
但是你的同事小明很粗心,总是忘记覆盖。结果导致class
B调用的还是A::getName().
选择2:
class
A{
public
virtual
std::string
getName()
=
0;
//纯虚函数,子类必须实现!
}
这样,无论小明多粗心。如果他的类里没有实现getName(),编译器会报错的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在定义和实现COM接口时,纯虚函数有不可替代的作用。
举个例子,可能有些牵强,但是能说明问题。
比如,我有一个类Animal,维护了一种动物形象,现在我要实现一个函数Draw,把这个动物画到任意一种介质上,这种介质可能是屏幕也可能是位图,当然,在屏幕和位图上画图形肯定是不一样的,那么,我的Draw函数肯定要有一个介质参数,每种介质对应一个版本的Draw函数,这样很麻烦,有了纯虚函数,就完全可以定义一个抽象类,以这个抽象类为参数,只写一个版本的Draw函数就可以了。
这个抽象类就是把在屏幕和位图上的绘图行为抽象出来,有点类似GDI+中的Graphics类(但它不是个抽象类)的概念,这个类定义有DrawRect和DrawText等纯虚函数,但是不去实现它,而是让针对屏幕绘图的子类和针对位图绘图的子类去实现这些函数。
这样所有像Animal的成员函数Draw那样,需要绘图的函数,都只需要有一个抽象类的指针或者引用,就可以绘图了,这就是纯虚函数的意义。
再举个伪代码的例子:
class
Animal
{
public:
virtual
SayHi()
=
0;
//无法实现,也没有必要实现。当然写个空的虚函数也行,但是万一我的函数需要返回值怎么办?强行写个返回值?C++的设计者当然不会允许这种情况出现。
完全可以没有数据成员,因为本来它就是抽象的类,其实也就是接口。
};
class
Dog
:
public
Animal
{
public:
virtual
SayHi()
{
cout
<<
lang;
}
private:
string
lang
=
"wang
wang";
};
class
Cat
:
public
Animal
{
public:
virtual
SayHi()
{
cout
<<
"miao
miao";
}
};
//虽然抽象类不能实例化,但是可以用它的引用或者指针,这就是纯虚函数能被利用的关键
这个函数只需要个动物参数,而动物类的所有函数在没有被具体到或者说继承到某个动物身上时是无法被实现的,但是所有的具体动物都可以作为参数传给我的函数,而且只要是动物传进来,不管是什么动物,我的函数都能正常的工作,这就是纯虚函数或者说抽象类的意义。
void
WhatAnimal(Animal
&a)
{
a.SayHi();
}
class
C
{
Animal
*a;
};
举个例子,可能有些牵强,但是能说明问题。
比如,我有一个类Animal,维护了一种动物形象,现在我要实现一个函数Draw,把这个动物画到任意一种介质上,这种介质可能是屏幕也可能是位图,当然,在屏幕和位图上画图形肯定是不一样的,那么,我的Draw函数肯定要有一个介质参数,每种介质对应一个版本的Draw函数,这样很麻烦,有了纯虚函数,就完全可以定义一个抽象类,以这个抽象类为参数,只写一个版本的Draw函数就可以了。
这个抽象类就是把在屏幕和位图上的绘图行为抽象出来,有点类似GDI+中的Graphics类(但它不是个抽象类)的概念,这个类定义有DrawRect和DrawText等纯虚函数,但是不去实现它,而是让针对屏幕绘图的子类和针对位图绘图的子类去实现这些函数。
这样所有像Animal的成员函数Draw那样,需要绘图的函数,都只需要有一个抽象类的指针或者引用,就可以绘图了,这就是纯虚函数的意义。
再举个伪代码的例子:
class
Animal
{
public:
virtual
SayHi()
=
0;
//无法实现,也没有必要实现。当然写个空的虚函数也行,但是万一我的函数需要返回值怎么办?强行写个返回值?C++的设计者当然不会允许这种情况出现。
完全可以没有数据成员,因为本来它就是抽象的类,其实也就是接口。
};
class
Dog
:
public
Animal
{
public:
virtual
SayHi()
{
cout
<<
lang;
}
private:
string
lang
=
"wang
wang";
};
class
Cat
:
public
Animal
{
public:
virtual
SayHi()
{
cout
<<
"miao
miao";
}
};
//虽然抽象类不能实例化,但是可以用它的引用或者指针,这就是纯虚函数能被利用的关键
这个函数只需要个动物参数,而动物类的所有函数在没有被具体到或者说继承到某个动物身上时是无法被实现的,但是所有的具体动物都可以作为参数传给我的函数,而且只要是动物传进来,不管是什么动物,我的函数都能正常的工作,这就是纯虚函数或者说抽象类的意义。
void
WhatAnimal(Animal
&a)
{
a.SayHi();
}
class
C
{
Animal
*a;
};
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询