看看此程序运行结果:

#include<iostream>

using namespace std;

class A{
public:
	void virtual f()
	{
		cout<<"A"<<endl;

	}
};


class B:public A{
public:
	void virtual f()
	{
		cout<<"B"<<endl;
	}
};
int main()
{
	A* pa=new A();
	pa->f();
	B* pb=(B *)pa;
	pb->f();

	delete pa,pb;
	pa=new B();
	pa->f();
	pb=(B *)pa;
	pb->f();

	return 0;
}



运行结果:

A

A

B

B

通过结果看问题,

1.在A* pa=new A();中创建了一个A对象,之后将pa和pb指针指向这个对象,但是这始终是A对象,而pa,和pb只是指针,所以调用的都是A对象中的f()函数。

2.典型的多态问题。


存在一个疑惑:就创建了一个对象,delete pa,pb;怎么没有错


这里说一下public,protected和private继承的问题

1.public 继承

基类中的成员访问权限在子类中不变,子类生成的对象访问基类的成员权限不变

2.protected继承

基类中的public和protected成员在子类中变为protected

3.private 

基类中的所有成员都在子类中变为private

注意:

在子类中的成员内部访问基类的成员权限是没有变的。


例子

#include<iostream>

using namespace std;

class A{

public:
	void  fA()
	{
		cout<<"fA()"<<endl;

	}
};


class B:private A{

public:
	void fB()
	{
		fA();
	}

};
int main()
{
	B b;
	b.fB(); //正确:打印fA()
	b.fA();//错误“A::fA”不可访问,因为“B”使用“private”从“A”继承

	return 0;
}