C++ 纯虚函数
2015-12-24 23:25
666 查看
什么是虚函数?
那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。
虚函数声明如下:virtual ReturnType FunctionName(Parameter);
虚函数必须实现,如果不实现,编译器将报错,错误提示为:
error LNK****: unresolved external symbol "public: virtual void __thiscall
ClassName::virtualFunctionName(void)"
为什么要用纯虚函数?
在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。为了解决这个问题,方便使用类的多态性,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual
ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。
在什么情况下使用纯虚函数(pure vitrual function)?
1,当想在基类中抽象出一个方法,且该基类只做能被继承,而不能被实例化;
2,这个方法必须在派生类(derived class)中被实现;
如果满足以上两点,可以考虑将该方法申明为pure virtual function.
eg
class Fuck
{
public:
Fuck():fuck_time(0),girlName("linzhiling") {}
virtual void fuck_show()=0 ;
protected:
unsigned fuck_time; // in minutes
private:
std::string girlName;
};
class FuckYou : public Fuck
{
public:
void fuck_show() { std::cout<<"fuck is so good!"<<std::endl; }
void fuck_high()
{
std::cout<<"we are fuck high"<<std::endl;
std::cout<<fuck_time<<std::endl;
// std::cout<<girlName<<std::endl; can't access private member of base class
}
};
//test code
int main()
{
std::cout<<"Test pure virtual function START"<<std::endl;
// Fuck f; //can't build object of Fuck which has a pure virtual member function
FuckYou f;
f.fuck_high();
f.fuck_show();
std::cout<<"Test pure virtual function END"<<std::endl;
return 0;
}
那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。
虚函数声明如下:virtual ReturnType FunctionName(Parameter);
虚函数必须实现,如果不实现,编译器将报错,错误提示为:
error LNK****: unresolved external symbol "public: virtual void __thiscall
ClassName::virtualFunctionName(void)"
为什么要用纯虚函数?
在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。为了解决这个问题,方便使用类的多态性,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual
ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。
在什么情况下使用纯虚函数(pure vitrual function)?
1,当想在基类中抽象出一个方法,且该基类只做能被继承,而不能被实例化;
2,这个方法必须在派生类(derived class)中被实现;
如果满足以上两点,可以考虑将该方法申明为pure virtual function.
eg
class Fuck
{
public:
Fuck():fuck_time(0),girlName("linzhiling") {}
virtual void fuck_show()=0 ;
protected:
unsigned fuck_time; // in minutes
private:
std::string girlName;
};
class FuckYou : public Fuck
{
public:
void fuck_show() { std::cout<<"fuck is so good!"<<std::endl; }
void fuck_high()
{
std::cout<<"we are fuck high"<<std::endl;
std::cout<<fuck_time<<std::endl;
// std::cout<<girlName<<std::endl; can't access private member of base class
}
};
//test code
int main()
{
std::cout<<"Test pure virtual function START"<<std::endl;
// Fuck f; //can't build object of Fuck which has a pure virtual member function
FuckYou f;
f.fuck_high();
f.fuck_show();
std::cout<<"Test pure virtual function END"<<std::endl;
return 0;
}
相关文章推荐
- C++函数pow()精度丢失问题
- Leetcode 9 - Palindrome Number
- C/C++判断文件是否存在
- 2015/12/24:嵌入式C语言的位操作随笔
- 2015/12/24:嵌入式C语言的位操作随笔
- 2015/12/24:嵌入式C语言的位操作随笔
- Leetcode 8 - String to Integer (atoi)
- 一起talk C栗子吧(第八十二回:C语言实例--简单圣诞树)
- 算术表达式语法分析
- C语言变量
- 实战c++中的智能指针unique_ptr系列-- 使用std::unique_ptr代替new operator(错误:‘unique_ptr’ is not a member of ‘std’)
- 实战c++中的智能指针unique_ptr系列-- 使用std::unique_ptr代替new operator(错误:‘unique_ptr’ is not a member of ‘std’)
- 极客必备之C++ 定时器
- C++为什么类的成员函数中(复制构造函数,赋值操作符等)可以有貌似类的对象访问类的私有成员的用法?
- 黑马程序员--C语言自学笔记---15C语言版通讯录
- 黑马程序员--C语言自学笔记---14static、extern、文件
- c语言学习(2)
- Leetcode 7 - Reverse Integer
- C++笔记——多态练习
- 黑马程序员--C语言自学笔记---13结构体、预编译、宏、条件编译