关于C++虚函数,纯虚函数以及模板等重要概念的深入讨论(一)

1.虚函数

        虚函数主要利用在多态的实现上,当基类的成员函数为虚函数时,它的子类函数如果也实现了这个虚函数,那么就可以实现多态的功能。

// Test1.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include "iostream"
using namespace std;


class A
{
private:
 int valueA;
public:
 A();
 A(int value);
 ~A();
 virtual void print();
};
//The class A realize.
A::A()
{
 valueA = 0;
}
A::A(int value)
{
 valueA = value;
}
A::~A(){}
void A::print()
{
 cout << "This is A print and Value is :" << valueA <<endl;
}

class B:public A
{
private:
 int valueB;
public:
 B();
 B(int value);
 ~B();
        void print();
 void draw();
};
//The class B realize.
B::B()
{
 valueB = 0;
}
B::B(int value):A(value)
{
 valueB = value;
}
B::~B(){}
void B::print()
{
 cout << "This is B print and Value is :" << valueB << endl;
}
void B::draw()
{
 cout << "This is B draw and Value is :" << valueB << endl;
}
int main(void)
{
 A *objectA = new A(10);
 B *objectB = new B(20);
 A *objectC = objectB;

 objectA->print();
 objectB->print();
 objectC->print();
 return 0;
}

上述代码输出为:

         

    从而我们可以清楚的看出objectC虽然属于A类的,但是由于多态的原理,A类中的print函数被B类给重载了,从而objectC输出的即是B类的print;还有一点值得注意要的是虚函数可以传参,但最好不要带有默认参数,否则会造成误解,倘若我们将print函数传入默认参数,main函数不变的话,代码如下(这里只写了A,B也应同理的改写print函数并将默认参数设为3):

class A
{
private:
	int valueA;
public:
	A();
	A(int value);
	~A();
	virtual void print(int value = 1);
};
//The class A realize.
A::A()
{
	valueA = 0;
}
A::A(int value)
{
	valueA = value;
}
A::~A(){}
void A::print(int value)
{
	cout << "This is A print and Value is :" << value <<endl;
}

那么输出的结果为:

       

    会惊讶的发现不是说好的:objectC输出的是B类的print的么?从而objectC不是应该输出为3么?为什么会这样呢?答案是函数依然调用的是B的print然而传参是A的print函数的参数;这就是为什么不建议为虚函数设置默认参数的原因所在。

2.析构与虚析构函数

    普通的析构函数如上例:~A(); 然后在实现它的地方执行内存释放等操作。而虚析构函数为:virtual ~A(); 即在析构函数前加入关键字virtual即可。通常在编写程序的过程中要求基类的析构函数必须为虚析构函数(抱歉上述代码本人没有按要求使用用虚析构函数,正常必须使用虚析构)。原因其实从上面的小节中就可知道,当实现多态时,即利用类似指针 objectC这种方式的时候,当objectC对象处理完了,需要调用析构的时候,这时候实际上在调用A的析构函数时,我们同样也要调用B的析构函数,普通的析构函数没法实现,而虚析构函数却可以顺利的实现,具体原理如果你彻底明白第一节的内容就会明白虚析构函数的原因,因此切记在编写程序的时候基类的析构函数必须为虚析构函数!!

<未完待续>

      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值