C++进阶—>子类、父类、父父类间虚函数调用详解

class one
{
public:
	one(int data=0):m1_data(data)
	{

	}

	int GetData()
	{
		return dodata(); 
	}

	virtual int dodata()
	{
		return m1_data;
	}

public:
	int m1_data;
};

class two:public one
{
public:
	two(int data=1):m2_data(data)
	{
		
	}

	int dodata()
	{
		return m2_data;
	}

public:
	int m2_data;
};

class three:public two
{
public:
	three(int data=2):m3_data(data)
	{
		
	}

public:
	int m3_data;
};

int _tmain(int argc, _TCHAR* argv[])
{
	three t(3);

	cout<<t.GetData()<<endl;
	cout<<t.one::GetData()<<endl;
	cout<<t.two::GetData()<<endl;
	cout<<t.three::GetData()<<endl;

	cout<<t.dodata()<<endl;
	cout<<t.one::dodata()<<endl;
	cout<<t.two::dodata()<<endl;
	cout<<t.three::dodata()<<endl;

	system("pause");
	return 0;
}

上述代码,three继承于two,two继承于one,实例化一个three对象,分别调用GetData(仅one类中有)和dodata(虚函数 two中重写)函数
程序执行结果为:

1:执行t.GetData(),three中无此函数,去父类two找也无此函数,再去父父类one中找到了此函数,执行调用了dodata函数,因为dodata为虚函数(虚函数实现了多态,根据实例化的对象选择调用哪个类中的函数,父类为虚函数 子类默认为虚函数 习惯上要在子类的函数前加上vitural关键字 也可不加)寻找two类中是否存在对此函数的重写,two存在重写,然后去three类中找对two类中dodata函数的重写,发现three中无dodata函数,则调用three父类的dodata函数,输出1。

1:加上了类作用符,直接执行one中的GetData,后续执行过程同上。

1:加上了类作用符,直接执行two中的GetData,发现不存在此函数,去父类one中找,后续执行过程同上。

1:直接执行three中的GetData,不存在此函数,后续执行过程同第一步。


1:去three中找dodata,不存在,再去父类two中找,虚函数dodata直接执行。

0:加上了类作用符,直接执行one中的dodata。

1:加上了类作用符,直接执行two中的dodata。

1:加上了类作用符,直接执行three中的dodata,但没有此函数,再去父类two中找,虚函数dodata直接执行。




对于子类、父类构造函数中虚函数间的调用关系可以参考http://blog.csdn.net/u012273328/article/details/51173111




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值