指向对象的指针的函数调用问题(含虚函数和纯虚函数知识)

首先是没有涉及虚函数的情况:

对象指针不能指向父类对象

执行同样的函数talk,选择执行指针所指定的talk
例如B *pb,则pb只能指向B或者子类对象,执行相同函数时只执行B的talk

</pre></p><p><pre name="code" class="cpp">#include<iostream>
#include<cmath>

using namespace std;

class A{
public:
	void talk()
	{
		cout<<"This is A"<<endl;
	}
};

class B:public A
{
public:
	void talk()
	{
		cout<<"This is B"<<endl;
	}
};


class C:public B
{
public:
	void talk()
	{
		cout<<"This is C"<<endl;
	}
};
class D:public C
{
public:
	void talk()
	{
		cout<<"This is D"<<endl;
	}	
};
int main(){
	A a;
	B b;
	C c;
	D d;
	B *pb;

	//pb=&a;  (Error!!) 
	//pb->talk();

	pb=&b;       //执行B的talk
	pb->talk();
	
	pb=&c;       //依旧执行B的talk
	pb->talk();

	pb=&d;      //依旧执行B的talk
	pb->talk();

	a.talk();  //这里只调用他们自己的
	b.talk();
	c.talk();
	d.talk();

	   
	//对象指针不能指向父类对象
	//执行同样的函数talk,选择执行指针所指定的talk
	//例如B *pb,则pb只能指向B或者子类对象,执行相同函数时只执行B的talk

	
	
}




然后是涉及虚函数的情况,如果父类中的那个talk是虚函数,则选择调用当前指向的类对象

#include<iostream>

using namespace std;
class A{
public:
	void talk()
	{
		cout<<"This is A"<<endl;
	}
};

class B:public A
{
public:
	virtual void talk()   //虚函数talk
	{
		cout<<"This is B"<<endl;
	}
};


class C:public B   //C继承B
{
public:
    void talk()
	{
		cout<<"This is C"<<endl;
	}
};
class D:public B   //D继承B
{
public:
	void talk()
	{
		cout<<"This is D"<<endl;
	}	
};

class E:public D  //E继承D,相当于继承B
{
public:
	void talk()
	{
		cout<<"This is E"<<endl;
	}	
};
int main(){
	A a;
	B b;
	C c;
	D d;
	E e;
	B *pb;

	//pb=&a;  (Error!!)  //依旧不能指向父类
	//pb->talk();

	pb=&b;       //执行B的talk
	pb->talk();
	
	pb=&c;       //执行C的talk
	pb->talk();

	pb=&d;      //执行D的talk
	pb->talk();

	pb=&e;      //执行D的talk
	pb->talk();

}





纯虚函数:定义的时候,不写纯虚函数的实现,  同时这个类被称作抽象类,不能被实例化

virtual void talk()=0;

继承抽象类的派生类,必须对纯虚函数进行实现,否则会报错(如果没加纯虚,则可以不实现的)

#include<iostream>

using namespace std;

class A
{
public:
	void talk();
};

class B:public A
{
public:
	virtual void talk()=0;  //纯虚函数talk

};


class C:public B   //C继承B
{
public:
    void talk()
	{
		cout<<"This is C"<<endl;
	}
};

class D:public B   //D继承B
{
public:
	
	void talk()
	{
		cout<<"This is D"<<endl;
	}
};

class E:public D  //E继承D,相当于继承B
{
public:
	void talk()
	{
		cout<<"This is E"<<endl;
	}	
};


int main(){
	A a;
	//B b;  (Error!)抽象类不可实例化,指针也不行
	C c;
	D d;
	E e;
	c.talk();
	d.talk();
	e.talk();
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值